快排

297 阅读1分钟

一、思想:

1、取左端、中间、右端的三个数进行排序,将中间数作为枢轴值。

2、将枢轴值放在数组的倒数第二位。

3、双向扫描,i从左边扫描比枢轴值大的数,j从右边扫描比枢轴值小的数,如果i<j,交换位置。

4、将枢轴值放在它的最终位置。如果i<pivot,交换位置。

二、程序:

var arr = [4,5,7,3,1,2,6,8];
function quickSort(arr,left,right){
    if(left < right){
        dealPivot(arr,left,right);
        var i = left;
        var pivot = right - 1;
        var j = pivot;
        while(true){
            while(arr[++i] < arr[pivot]){
            }
            while(j > left && arr[--j] > arr[pivot]){
            }
            if(i < j){
                swap(arr,i,j);
            }else{
                break;
            }
        }
        if(i < pivot){
            swap(arr,i,pivot);
        }
        quickSort(arr,left,i-1);
        quickSort(arr,i+1,right);

    }
}
function dealPivot(arr,left,right){
    var mid = parseInt((left + right)/2);
    if(arr[left] > arr[mid]){
        swap(arr,left,mid);
    }
    if(arr[left] > arr[right]){
        swap(arr,left,right)
    }
    if(arr[mid] > arr[right]){
        swap(arr,mid,right);
    }
    swap(arr,mid,right-1);
}
function swap(arr,a,b){
    var temp = arr[a];
    arr[a] = arr[b];
    arr[b] = temp;
}
quickSort(arr,0,arr.length-1);
console.log(arr);