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<arr.length;i++) {
      if(arr[i]<pivot){
        left.push(arr[i]);
      }
      else{
        right.push(arr[i]);
      }

    }
    return quickSort(left).concat(pivot,quickSort(right));
  }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容