选择排序
思路:将第一个数和后面其他的每一个对比,如果比第一个数小,那么就和第一个数交换,然后再将第二个数和后面的每个数对比 然后如此依次循环 然后得到从小往大依次排列的数。
// 1.准备好要排列的数
var arr = [5,3,6,8,1,7,9,4,2]
// 循环
for(let i=0;i<arr.length;i++) {
// 保存最小位置的索引
let minPoint = i;
// 要对比的数 从i+1开始
for(let j=i+1;j<arr.length;j++) {
if(arr[j]<arr[minPoint]) {
// 交换
let temp = arr[j]
arr[j] = arr[minPoint]
arr[minPoint] = temp
}
}
}
计算时间复杂度
var arr = [5,3,6,8,1,7,9,4,2] //常数 时间复杂度为O(1)
for(let i=0;i<arr.length;i++) {
// 保存最小位置的索引
let minPoint = i; // 循环n次 时间复杂度为O(n)
// 要对比的数 从i+1开始
for(let j=i+1;j<arr.length;j++) {
// 第二层for循环里面时间复杂度为: n(n-1)...1
if(arr[j]<arr[minPoint]) {
// 交换
let temp = arr[j]
arr[j] = arr[minPoint]
arr[minPoint] = temp
}
}
}
还有什么可以优化的空间呢?
第一次循环的时候,循环到n-1即可;因为在n-1的时候n-1的值已经和n对比了 如果循环到最后一个n 再对比一次也没必要。所以第一个for循环可以减少一次到n-1
var arr = [5,3,6,8,1,7,9,4,2] //常数 时间复杂度为O(1)
for(let i=0;i<arr.length-1;i++) {
// 保存最小位置的索引
let minPoint = i; // 循环n次 时间复杂度为O(n)
// 要对比的数 从i+1开始
for(let j=i+1;j<arr.length;j++) {
// 第二层for循环里面时间复杂度为: n(n-1)...1
if(arr[j]<arr[minPoint]) {
// 交换
let temp = arr[j]
arr[j] = arr[minPoint]
arr[minPoint] = temp
}
}
}
版权声明:本文为SpringCloudTest原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。