在学习了冒泡排序之后,再来学习选择排序应该就能更好理解这个算法了。
选择排序比较直观,就是从没有排序的元素中选出最大或最小的元素放到已排序好的元素后面。
选择排序
1、比较未排序区域的元素,选出最大或最小的元素放到排序区域。
2、一趟比较完成之后,再从剩下未排序的元素开始比较。
3、反复执行以上步骤,只到排序完成。
算法
function selectSort(nums){
let n = nums.length;
let minIndex,temp;
for(let i=0;i<n-1;i++){
minIndex = i;
for(let j=i+1;j<n;j++){
if(nums[minIndex]>nums[j]){
minIndex = j;
}
}
temp = nums[i];
nums[i] = nums[minIndex];
nums[minIndex] = temp;
}
return nums;
}
疑惑探究
疑惑1:双循环的理解
探究1:外层循环控制总共需要跑的趟数,n个元素需要n-1趟,和冒泡排序相同,循环条件:
for(let i=0;i<n-1;i++){}
内层循环控制剩下未排序元素的遍历,已经排过序的不用在排序。每次开始的元素是逐渐往后的,所以内层循环的j=i,又因为自己不用和自己比较,j=i+1。
for(let j=i+1;j<n;j++){}
疑惑2:交换方式
temp = nums[i];
nums[i] = nums[minIndex];
nums[minIndex] = temp;
探究2:和冒泡排序不同,这个交换在外层循环的时候进行交换,而不是和冒泡排序一样每次内层循环判断都要交换。
从这个交换方式可以看出,每次交换是循环开始的元素与选择出来最小或最大的元素交换,也就是说每次交换之后都会把选择出来的元素放到前面排序好元素的后面。
简要概括
选择排序的理解更直接,就是选出最小的或最大的元素放到排序元素的后面,然后再从剩下未排序的元素继续选择。与冒泡排序有相同之处,也有不同之处,需要好好分析和理解,否则就会搞混淆。