从零开始学算法 - 选择排序
选择排序的思路:
假设当次遍历第一个数字是数组中最小的,循环后面的数字,依次和它作比较,如果有更小的,就换到第一个。
每一次遍历,最小的数字就会被选择到数组的最前面,几次遍历过后,数组的排序完成。
用一个长度为10的数组,解释一下选择排序的过程:
原始数组:[72, 34, 51, 80, 14, 92, 84, 95, 68, 22]
第一次遍历:
初始选择:[72, 34, 51, 80, 14, 92, 84, 95, 68, 22]
选择交换:[34, 72, 51, 80, 14, 92, 84, 95, 68, 22]
选择交换:[14, 72, 51, 80, 34, 92, 84, 95, 68, 22]
找不到比14更小的数字后,第一次遍历完成。
将上述过程翻译成代码:
基本实现:
function selectSort(arr){ for(var i=0;i<arr.length;i++){
//假设arr[i]是最小值 var min = arr[i]; for(var j=i+1;j<arr.length;j++){
//循环中遇到比arr[i]更小的,就交换 if(min>arr[j]){ var tmp = min; min=arr[j]; arr[j]=tmp; } } arr[i]=min; }
}
优化一下:
找到当次循环中的最小值后,再交换,可以减少操作数组的次数。
function selectSort(arr){ for(var i=0;i<array.length;i++){
//只假设最小值的下标 var minIndex = i; for(var j=i+1;j<array.length;j++){
//循环找到更小值时,也只交换下标 if(array[minIndex]>array[j]){ minIndex = j; } }
//找到最小下标后,再进行交换 if(minIndex != i){ var tmp = array[minIndex]; array[minIndex] = array[i]; array[i] = tmp; } }
}