排序方法比较

鸡尾酒 排序

var cocktailSort= function(array) {
  var top = array.length - 1, bottom = 0,flag = true,i, j;
  while (flag) {
    flag = false;
    //从左到右到大,把最大的放到每次范围的最右边
    for (i = bottom; i < top; i++) {
      if (array[i] > array[i + 1]) {
        swap(array, i, i + 1);
        flag = true;
      }
    }
    top--;
    //从右到到左,把最小的放到每次范围的最小边
    for (j = top; j > bottom; j--) {
      if (array[j] < array[j - 1]) {
        swap(array, j, j - 1);
        flag = true;
      }
    }
    bottom++;
  }
}
 
var swap = function(array,a,b){
  var tmp = array[a];
  array[a] = array[b]
  array[b] = tmp;
}

侏儒排序

var gnomeSort =function(array){
  var len = array.length,i = 0;//把i想象为侏儒
  while(i < len){
    if (i == 0 || array[i-1] <= array[i])
    //array[i-1]与array[i]想象为花盆
    //侏儒站于array[i]的前面
      i++;//由于顺序正确,侏儒就转而站在array[i+1]的前面
    else{
      swap(array,i, --i);//如果顺序不正确,交换花盘,站在array[i-1]的前面
      test(array)
    }
  }
}
var swap = function(array,a,b){
  var tmp = array[a];
  array[a] = array[b]
  array[b] = tmp;
}



组合排序

var combSort = function(array){
  var gap = array.length;
  do{
    gap = gap * 10 / 13
    if(gap === 9 || gap === 10)
      gap = 11
    if(gap < 1){
      gap = 1
    }
    var swapped = false;
    for(var i=0;i<array.length-gap;i++){
      var j = i + gap
      if(array[i]>array[j]){
        var temp = array[i];
        array[i] = array[j];
        array[j] = temp;
        test(array)
        swapped = true
      }
    }
    if(gap == 1 && !swapped){
      break;
    }
  }while(1);
}


希尔排序
又称缩小增量排序:

function shellSort(array) {
      var j, i, v, h=1, s=3, k,n = array.length
      while(h < n)
        h=s*h+1;
      
      while(h > 1) {
        h=(h-1)/s;
        for (k=0; k<h; k++)
          for (i=k+h,j=i; i<n; i+=h, j=i) {
            v=array[i];
            while(true)
              if ((j-=h) >= 0 && array[j] > v)
                array[j+h]=array[j];
            else
              break;
            array[j+h]=v;
          }
      }
    }

快速排序
var qurckSort = function(array){
    function qsort(array, begin, end){
      if(end>begin){
        //找到枢纽
        var index = partition(array, begin, end);
        qsort(array, begin, index-1);
        qsort(array, index+1, end);
      }
    }
    //定义三个内部函数
    function partition(array, begin, end){
      //随意定位枢纽的位置
      var index=begin+Math.floor(Math.random()*(end-begin));
      //获取枢纽的值
      var pivot=array[index];
      //获取枢纽后, 将其置放到数组的最后一个位置
      swap(array,index,end);
      //之后循环数组, 与枢纽进行比较, 相当于重新排数组
      for(var i=index=begin;i<end;i++){
        //如果当前元素小于枢纽,则交换位置
        if(array[i]<pivot){
          swap(array, index++, i);
        }
      }
      swap(array, index, end);
      return index;
    }
    function swap(array,a,b){
      var tmp = array[a]
      array[a] = array[b]
      array[b] = tmp ;
    }
    qsort(array, 0, array.length-1);
  }

posted @ 2012-09-13 17:14  love-java  阅读(121)  评论(0)    收藏  举报