原理:在要排序的一组数中,选出最小的一个数与第一个位置的数交换,然后剩下的数当中找出最小的与第二个位置的数交换,如此循环直到倒数第二个数和最后一个数为止。
静态图:
特点:可以说是冒泡排序的衍生品,效率比较一般般
代码实现:
// 在无序区中选出最小的元素,然后将它和无序区的第一个元素交换位置。 function selectSort(arr){ length = arr.length; for (var i = 0; i < length; i++){ // 循环数组 var _min = arr[i]; // 把每一次的 数组里面的数字记录下来 var k = i; // 记录下来索引 for (var j = i + 1; j < length; j++){ // 当前的数字与后一个数字相比较 if (_min > arr[j]){ //当前的数 大于 后面一个数的话 _min = arr[j]; // 就讲后面 的数值 保存下来 k = j; /// 保存索引 } } arr[k] = arr[i]; // 进行交换位置 arr[i] = _min; } return arr; } var arr=[2,3,6,4,2,1,90,100,20,5]; console.log(selectSort(arr)); // [1, 2, 2, 3, 4, 5, 6, 20, 90, 100]
奇偶排序
原理:
选取所有奇数列的元素与其右侧相邻的元素进行比较,将较小的元素排序在前面;
选取所有偶数列的元素与其右侧相邻的元素进行比较,将较小的元素排序在前面;
重复前面两步,直到所有序列有序为止。
如下图所示:
gif图:
特点:奇数和偶数序列交替比较
代码实现:
function oddEvenSort(arr){ //swaped用来控制循环是否要继续,如果左边的都比右边的小,则退出循环,返回排好的数组 var swaped=true; var k=0; while(swaped){ if(k>0){ swaped=false; } for(var i=k;i<arr.length-1;i+=2){ if(arr[i]>arr[i+1]){ // 如果左边的数字比右边的大,两者交换位置 arr[i]=[ arr[i+1], arr[i+1]=arr[i] ][0]; swaped=true; } } k=[1,0][k]; //奇数和偶数之间的转行 } return arr; } var arr=[2,3,6,4,2,1,90,100,20,5]; console.log(oddEvenSort(arr)); // [1, 2, 2, 3, 4, 5, 6, 20, 90, 100]
总结
本文只是总结了算法中的一部分,算法的精髓就在于他们的思想,在js中用处应该不是很大。如果第一遍看不太懂那些代码,可以试着自己敲一遍,我在总结的时候,遇到理解不了的代码,自己敲完理解程度就会加深一些。
理解完,确实这些算法的实现思想博大精深,不得不感慨一下前辈们思想的深度。