javascript快排三种解法

方法1. 最浅显易懂的

http://www.ruanyifeng.com/blog/2011/04/quicksort_in_javascript.html

var quickSort = function(arr) {

  if (arr.length <= 1) { return arr; }

  var pivotIndex = Math.floor(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));

};

方法2

思路来自中国大学mooc的浙大的数据结构这门课里的。先贴代码:(出了bug。输出的是0,1,2,3,4,5,6,7,9,8)

function ArrayList(){

    var array = [];

    this.insert = function(item){
        array.push(item);
    };

    this.toString= function(){
        return array.join();
    };

    this.quickSort = function(){
        quick(array,  0, array.length - 1);
    };

    var swapQuickStort = function(array, index1, index2){
        var aux = array[index1];
        array[index1] = array[index2];
        array[index2] = aux;
    };

    
    var Median3 = function(array, left, right){
        var center = Math.floor((left + right)/2);
        if(array[left] > array[right]){
            swapQuickStort(array, left, right);
        }
        if(array[left] > array[center]){
            swapQuickStort(array, left, center);
        }
        if(array[center] > array[right]){
            swapQuickStort(array, center, right);
        }
        /*此时array[left]<=array[center]<=array[right]*/
        swapQuickStort(array, center, right-1);//将基准pivot藏到右边
        /*只需要考虑array[left+1]...array[right-2],因为array[left]在上面经过调整一定比基准小,array[right]一定比基准大,array[right-1]即基准,值就是基准对应的值*/
        return array[right-1];

        // 下面三行也可以表示array[right-1]
        // var pivot = array.splice(right-1,1)[0];//这个splice是要删数组的,不能删啊!后面有影响的
        // array.splice(right-1, 0, pivot);//所以上一行取完数之后要把数重新添加回去
        // return pivot;
    };

    var quick = function(array, left, right){
        var pivot, low, high;

        if(left < right){
            console.log(array);
            pivot = Median3(array, left, right);

            low = left; high = right-1;
            while(1){/*将序列中的比基准小的移到基准左边,大的移到右边*/
                while(array[++low] < pivot);//注意了,这两句while在js是不行的。不要用[++low]用另一种表达代替
                while(array[--high] > pivot);
                if(low < high) swapQuickStort(array, low, high);
                else break;
            }
            swapQuickStort(array, low, right-1);
            quick(array, left, low-1);
            quick(array, low+1, right);
        }
        
    };
}


console.log('********** Quick Sort **********');
 var array = new ArrayList();

array.insert(3);
array.insert(1);
array.insert(4);
array.insert(5);
array.insert(0);
array.insert(2);
array.insert(9);
array.insert(8);
array.insert(7);
array.insert(6);

console.log(array.toString());

array.quickSort();

console.log(array.toString());

有些地方不明白?没关系!手动图解~还不懂的话先画图,再不懂的话可以留言~

10.10补充:仍未解决 

//记得之前改过代码,也成功过的。但是现在找不到了,现在这个代码还是有些错误。
     function swapQuickStort(array, index1, index2){        
        var aux = array[index1];
        array[index1] = array[index2];
        array[index2] = aux;
    };
 
    
    function Median3(array, left, right){
        var center = Math.floor((left + right)/2);
        if(array[left] > array[right]){
            swapQuickStort(array, left, right);
        }
        if(array[left] > array[center]){
            swapQuickStort(array, left, center);
        }
        if(array[center] > array[right]){
            swapQuickStort(array, center, right);
        }
        /*此时array[left]<=array[center]<=array[right]*/
        swapQuickStort(array, center, right-1);//将基准pivot藏到右边
        /*只需要考虑array[left+1]...array[right-2],因为array[left]在上面经过调整一定比基准小,array[right]一定比基准大,array[right-1]即基准,值就是基准对应的值*/
        return array[right-1];
    };
 
    function quick(array, left, right){
        var pivot, low, high;
 		console.log('left:'+left+' '+'right:'+right);
 		console.log(`array[${left}]`+':'+array[left]+' '+`array[${right}]`+':'+array[right]);
        if(left < right){
            
            pivot = Median3(array, left, right);
 			
            low = left+1; high = right-2;
			console.log('pivot:'+pivot+' '+'low:'+low+' '+'high:'+high);
            while(1){/*将序列中的比基准小的移到基准左边,大的移到右边*/
                while(array[low] < pivot)low++;
                while(array[high] > pivot)high--;
                if(low < high) {
				console.log('swap ' + array[low] + ' with ' + array[high]);
				swapQuickStort(array, low, high);
                }
                else break;
            }
            //swapQuickStort(array, low, right-1);//①
            if(low<=right-1){
		swapQuickStort(array, low, right-1);
	    }
            quick(array, left, low-1);
            quick(array, low+1, right);
        }
        
    };
 
 
 
console.log('********** Quick Sort **********');
var array = [3,1,4,5,0,2,9,8,7,6];
 
console.log(array.toString());
 
quick(array,  0, array.length - 1);
console.log(array.toString());//输出0,1,2,3,4,5,6,7,9,8  <=怎么就9,8了...

利用console.log查了一下快排顺序,原因出在while(1)后面的“swapQuickStort(array, low, right-1);”(即①

 此时的low=left+1=8+19,right=9,right-1=8,8,9位置的值要对调。因此我直接在进行对调的地方前加一个if判断:暂时解决了问题,不知道还会不会出新问题

方法3

源码来自学习Javascript数据结构与算法。找工作笔试面试啥的背这个吧

function ArrayList(){

    var array = [];

    this.insert = function(item){
        array.push(item);
    };

    this.toString= function(){
        return array.join();
    };

    this.quickSort = function(){
        quick(array,  0, array.length - 1);
    };

    var swapQuickStort = function(array, index1, index2){
        var aux = array[index1];
        array[index1] = array[index2];
        array[index2] = aux;
    };

    var partition = function(array, left, right) {

        var pivot = array[Math.floor((right + left) / 2)],
            i = left,
            j = right;

        // console.log('pivot is ' + pivot + '; left is ' + left + '; right is ' + right);

        while (i <= j) {
            while (array[i] < pivot) {
                i++;
                // console.log('i = ' + i);
            }

            while (array[j] > pivot) {
                j--;
                // console.log('j = ' + j);
            }

            if (i <= j) {
                // console.log('swap ' + array[i] + ' with ' + array[j]);
                swapQuickStort(array, i, j);
                i++;
                j--;
            }
        }

        return i;//这是返回数组下标。注意i与方法二的low的意义不太一样。方法二的low就代表了正确的点
                 //这里正确的点是在i-1,所以quick里面才有"index-1"与"index"本身
    };

    var quick = function(array, left, right){

        var index;

        if (array.length > 1) {

            index = partition(array, left, right);

            if (left < index - 1) {
                quick(array, left, index - 1);
            }

            if (index < right) {
                quick(array, index, right);//将index塞进去,说明index不代表一趟快排之后正确的位置
                                           //因为如果代表的话,它是不需要参与之后的排序的
            }
        }
        return array;
    };
}


console.log('********** Quick Sort **********');
 var array = new ArrayList();

array.insert(3);
array.insert(5);
array.insert(1);
array.insert(6);
array.insert(4);
array.insert(7);
array.insert(2);

console.log(array.toString());

array.quickSort();

console.log(array.toString());

整理之后可以背的:(改了一点点,将index变成了一趟快排之后的正确位置)

function swapQuickStort(array, index1, index2){
        [array[index1],array[index2]] = [array[index2],array[index1]];
    };
 
function partition(array, left, right) { 
    var pivot = array[Math.floor((right + left) / 2)],
        i = left,
        j = right;
 
    while (1) {
        while (array[i] < pivot) i++;
        while (array[j] > pivot) j--;
 
        if (i < j) {
            swapQuickStort(array, i, j);
        }else{
    		break;
		}
    }
 
    return i;
};
 
function quick(array, left, right){
 
    var index;
 
    if (array.length > 1) {
 
        index = partition(array, left, right);
 
        if (left < index) {
            quick(array, left, index-1);
        }
 
        if (index < right) {
            quick(array, index+1, right);
        }
    }
    return array;
};
 
 
console.log('********** Quick Sort **********');
var array = [3,5,1,6,4,7,2];
 
console.log(array.toString());
 
quick(array,  0, array.length - 1);
 
console.log(array.toString());

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值