快速排序算法的两种不同实现

这两天在看快速排序算法,先是看的《算法》第四版的书,然后再在网上找网友的博客看,最后理解了两种不同的快排的实现():《算法》书上的是找到一个比基准数大和一个比基准数小,然后对换其位置,左游标自加,右游标自减,当右游标小于左游标的时候跳出循环,将基准数和右游标位置对换,然后递归调用,具体实现看代码吧,用javascript写的,可以直接在firefox的代码草稿纸上运行,比较简单,代码如下:

function quick_sort2(arr,lo,hi){
  var i=lo,j=hi+1,x=arr[lo];
  if(i<j){
    while(true){
    while(arr[++i]<x) if(i == hi) break;
    while(arr[--j]>x) if(j == lo) break;
    if(i>=j) break;
    var dd = arr[i];
    arr[i] = arr[j];
    arr[j] = dd;
  }
  var d = arr[lo];
  arr[lo] =arr[j];
  arr[j] = d;
  quick_sort2(arr,lo,j-1);
  quick_sort2(arr,j+1,hi);
  }
  return arr;
}
var arrr = [8,1,3,2,15,22,16,1,15];
var result = quick_sort2(arrr,0,arrr.length-1);
console.log(result);//[1, 1, 2, 3, 8, 15, 15, 16, 22]

第二种是“挖坑填坑法”,确定基准数(一般树下标为0的数),从数组右边开始向左边查找小于基准数的数字,将其填到基准数的坑里面,然后自己的位置上相当于留下了一个“坑”,然后从左边向右边查找一个大于基准数的值,填入上一次挖的那个“坑”里面,直到右游标大于左游标,跳出循环,进行递归调用,代码如下:

function quick_sort(s, l, r){
  if (l < r){
    var i = l, j = r, x = s[l];
    while (i < j){
      while(i < j && s[j] >= x)
        j--; // 从右向左找第一个小于x的数
      if(i < j)
        s[i] = s[j];
      while(i < j && s[i] < x)
        i++; // 从左向右找第一个大于等于x的数
      if(i < j)
        s[j] = s[i];
    }
    s[i] = x;
    quick_sort(s, l, i - 1); // 递归调用
    quick_sort(s, i + 1, r);
  }
  return s;
}

var arr = [2,3,4,5,66,7,8,7,6,5,6,6,22,1,3,3,44,55];
console.log('arr.length='+arr.length);
var ss = quick_sort(arr,0,arr.length-1);
console.log(ss);//1, 2, 3, 3, 3, 4, 5, 5, 6, 6, 6,6,7,7,8,22,44,55,66 ]

语言组织不太好,见谅。第二种从“白话经典算法系列 ”看来的,只不过改为javascript版本

另外,两种不同实现的复杂度O还不会计算,还在学习ing

posted @ 2017-03-10 16:53  梦想在路上  阅读(827)  评论(0)    收藏  举报