2018-06-21

常用排序算法总结

插入排序

  • 一般方法 :

在第P趟,将位置P上的元素向左移动到它在前P+1个元素中的正确位置上。对于P=1到P=N-1趟,插入排序保证从位置0到位置P上的元素为已排序状态。

  • 复杂度

最好的情况:数组完全有序,每次插入只需要和插入位置的前一个元素,因此复杂度为O(N);
最坏的情况:数组完全逆序,在插入第n个位置时,需要比较前n-1 个,次数为1+2+···+n-1+n=n*(n-1)/2. 因此复杂度为O(n^2).


JavaScript算法实现

function InsertionSort(arr,n) {
var j,p,temp;//p趟插入,n=arr.length时能完全排序
for (p = 1; p < n; p++) {
    temp = arr[p];
    for(j=p; j>0&&arr[j-1]>temp; j--) {
        arr[j] = arr[j-1];
    }
    arr[j] = temp;
}
return arr;
}

快速排序

  • 算法步骤
  1. 如果数组S的元素个数是1或0,则返回。
  2. 取S中任一元素v,作为枢纽 元。
  3. 将S-{v} 分为两个不相交的集合:S1={x∊S-{v} | x<=v} 和 S2={x∊S-{v} | x>=v}
  4. 返回 { quicksort(s1)后,继而v,进而 quicksort(s2) }
  • 算法分析

它的平均运行时间为O(N log N),它的最坏性能为O(N^2).

  • 算法思想以及算法实现
  1. 选取枢纽元

三中值法:一般方法是选择左端、右端和中心位置上的三个元素中值作为枢纽元

            var media3 = arr[0].concat(pivot,arr.pop()).sort((a,b)=>{return a-b;})[1];

后面用递归法实现s1 . s2 的排序

   function quickSort(arr) {
    if(arr.length<=1){
      return arr;
    }
    var pivotIndex = parseInt(arr.length/2);
    var pivot = arr.splice(pivotIndex,1)[0];//直接选取中间值为枢纽元
    var left = [];
    var right = [];
    for(var i=0;i

你可能感兴趣的:(2018-06-21)