懒散了良久,人有点生锈,所以写个算法系列让本身头脑活泼起来。
(一切类型一概从小到大排序)
挑选排序比冒泡的革新是,不会频仍交流元素,而只是纪录索引,末了再交流。
挑选排序
给定数组:
var list = [ 54, 26, 93, 17, 77, 31, 44, 88, 55, 20 ];
算法形貌:
起首设k=0,假定首元素既索引k代表最小元素,然后将第一个元素与第二个元素对照,假如第一个元素比第二个元素大,变动此时的索引k=1,既如今第二个元素是最小元素,此时:
k = 1;
将第二个元素与第三个元素对照,此时第二个元素比第三个元素小,坚持原样稳定;
k = 1;
反复上面的步骤,直到末了我们用倒数第二个元素与倒数第一个元素比拟以后;经由第一轮排序,我们肯定了最小元素的索引,然后与首元素交流位置,此时最小元素分列在数组首尾;
k = 3; [list[0], list[3]] = [list[3], list[0]];
然后我们反复1,2,3步骤;经由第二轮我们会找到次小的元素索引,放到数组第二位;
k = 9; [list[1], list[9]] = [list[9], list[1]];
再次反复直到全部数组有序;
第1轮: [ 17, 26, 93, 54, 77, 31, 44, 88, 55, 20 ] 第2轮: [ 17, 20, 93, 54, 77, 31, 44, 88, 55, 26 ] 第3轮: [ 17, 20, 26, 54, 77, 31, 44, 88, 55, 93 ] 第4轮: [ 17, 20, 26, 31, 77, 54, 44, 88, 55, 93 ] 第5轮: [ 17, 20, 26, 31, 44, 54, 77, 88, 55, 93 ] 第6轮: [ 17, 20, 26, 31, 44, 54, 77, 88, 55, 93 ] 第7轮: [ 17, 20, 26, 31, 44, 54, 55, 88, 77, 93 ] 第8轮: [ 17, 20, 26, 31, 44, 54, 55, 77, 88, 93 ] 第9轮: [ 17, 20, 26, 31, 44, 54, 55, 77, 88, 93 ]
算法完成:
function select(list) {
// 做length-1轮比较
for (let i = 0; i < list.length - 1; i++) {
// 假定k是最小元素
let k = i;
// 两两对照 找到比最小元素还小的索引
for (let j = i + 1; j < list.length; j++) {
if (list[j] < list[k]) {
k = j;
}
}
// 交流
[list[i], list[k]] = [list[k], list[i]];
}
}
// 测试
var list = [ 54, 26, 93, 17, 77, 31, 44, 88, 55, 20 ];
select(list);
console.log(list);
// [ 17, 20, 26, 31, 44, 54, 55, 77, 88, 93 ]