数据结构与算法-快速排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法-快速排序相关的知识,希望对你有一定的参考价值。

快速排序

在待排序数组中,首先任意选取一个数据作为关键数据(通常取第一个或中间一个),然后将所有比它小的数都放到它左边,所有比它大的数都放到它右边,这个过程称为一趟快速排序。再递归直到结束排序。

从j开始向前搜索(j--),遇到小于key的就将array[j]与array[i]交换;从i往后搜索(i++),遇到大于key的就将array[i]与array[j]交换;再递归。

快速排序是不稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。

举个栗子:  

将第一个数字作为关键数据 key=6;

6  2  7  3  8  9  此时i=0;j=5;

3  2  7  6  8  9  此时i=0;j=3;

3  2  6  7  8  9  此时i=2;j=3;

3  2  6  7  8  9  此时i=j=2;第一次循环结束

 

function quickSort(array){
    function sort(prev, numsize){
        var i = prev;
        var j = numsize -1;
        var key = array[prev];
        if ((numsize - prev) > 1) {
            while(i < j){
                for(; i < j; j--){
                    if (array[j] < key) {
                        array[i++] = array[j]; //a[i] = a[j]; i += 1;
                        break;
                    };
                }
                for( ; i < j; i++){
                    if (array[i] > key){
                    array[j--] = array[i];
                    break;
                    }
                }
            }
            array[i] = key;
            sort(0, i);
            sort(i + 1, numsize);
        }
    }
    sort(0, array.length);
    return array;
}

 

另外还有一种简单易懂的方法:

设置两个空数组left和right,将整个数组进行遍历,遇到小于关键数据的就push进left,否则放进right。此处以中间数作为关键数据更好理解。

 

function quickSort(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));
}

 

 

 

以上是关于数据结构与算法-快速排序的主要内容,如果未能解决你的问题,请参考以下文章

重学数据结构和算法之归并排序快速排序

数据结构与算法

数据结构与算法(19)——快速排序

快速排序-递归实现

JavaScript 数据结构与算法之美 - 归并排序快速排序希尔排序堆排序

数据结构与算法—快速排序(Java实现)