数据结构之排序算法(三)

// 交换函数
    function swap(arr, a, b){
        var temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }

    // 快速排序
    // 返回  p  保证 arr[l...p-1] < arr[p] 且 arr[p+1...r] > arr[p]

    function Partition(arr, l, r){
        var i,j,k;
        // j 代表
        i=j=l;
        for(k=l+1; k<=r; k++){
            if(arr[k] < arr[i]){
                j++;
                swap(arr,j, k)
            }
        }
        swap(arr, j, i)
        
        return j;
    }

    function QuickSort(arr, l, r) {
        if(l >= r) {
            return ;
        }
        var p = Partition(arr, l, r);
        
        QuickSort(arr, l, p-1);
        QuickSort(arr, p+1, r);
    }

快速排序主要思想是  在Partition函数上

设置了两个k,j

k 表示的是遍历的当前元素的位置

j 表示的是大于一个元素  和 小于第一个元素的  边界

p  保证 arr[l...p-1] < arr[p] 且 arr[p+1...r] > arr[p]

快速排序是nlog(n)级别的排序算法,其排序时间也是很快的l

    // 当数组元素中有大量的元素 是一样的情况下
    // 会导致快排的时候一端 变得非常长  而另一端变得很短
    //  这时如果重新改变 Partition函数  尤为重要

    
    function Partition2(arr, l, r){
        var i,j;
        // 保证 [l+1...i) <= arr[l]
        //       [j...r]  >=  arr[l]
        swap(arr, l, Math.floor(Math.random()*(r-l+1))+l);
        i= l+1;
        j = r;
        while(true){
            while( i <= r && arr[i] < arr[l]) { i++; }
            while( j >= l+1 && arr[j] > arr[l]) { j--; }
            if( i > j) {
                break;
            }
            swap(arr, i, j)
            i++;
            j--;
        }

        swap(arr, l, j)

        return j;
    }

    function QuickSort2(arr, l, r) {
        if(l >= r) {
            return ;
        }
        var p = Partition2(arr, l, r);
        
        QuickSort(arr, l, p-1);
        QuickSort(arr, p+1, r);
    }

猜你喜欢

转载自blog.csdn.net/qq_39081958/article/details/81741599