总结一下学习的复杂度为O(n^2)的三种排序算法:选择排序,插入排序,希尔排序。
(1)选择排序:从第一个位置开始每次查找剩下的位置中最小的数值放入当前位置;
(2)插入排序:从第二个位置开始,每次都将当前位置的数值插入前面合适的位置,对于几乎有序的数列来说,插入排序能带来更高的效率;
(3)希尔排序:变步长区间的插入排序,指定一个步长衰减率,每一轮插入排序都将间隔指定步长的数值排序完成,当步长衰减为1时,就成了标准的插入排序。
代码实现:
(1)选择排序
var selectSort = function(arr,len){ var i,j,min; for(i = 0; i < len; ++i){ min = i; for(j = i + 1; j < len; ++j){ if(arr[min] > arr[j]){ min = j; } } swap(arr,i,min); }};
(2)插入排序
var insertSort = function(arr,len){ var i,j,k; for(i = 1; i < len; ++i){ k = i; for(j = i-1; j >= 0; --j){ if(arr[j] > arr[k]){ swap(arr,k,j); k--; }else{ break; } } }};
(3)希尔排序
var shellSort = function(arr,len,stepInterval){ var step,i,j,k; for(step = Math.floor(len / stepInterval); step > 0; step = Math.floor(step/stepInterval)){ for(i = step; i < len; ++i){ k = i; for(j = i - step; j >= 0 && arr[j] > arr[k]; j -= step){ swap(arr,k,j); k = j; } } }}
总结:
(1)可以从整理扑克牌的不同方式来帮助理解,选择排序就是每次都从剩下的牌里取最小的牌放到手里最后的位置;插入排序就是每次都将剩下的牌里任取的一张插入手中牌里合适的位置;
(2)希尔排序最关键是理解它是步长衰减的插入排序。