快速排序的改进-随机快速排序

随机化快速排序

快速排序是一种高效的排序方法,但是如果我们的输入数组是排好序的一个数组,快速排序的运行时间就会变成O(n^2)。虽然这种情况很少会出现,但我们还是应该避免。

算法导论书籍中的修改方法:在排序方法中随机化选取主元。根据计算,改进后的方法时间复杂度的期望为O(nlgn)。

下面是改进后的代码:

    /// <summary>
    /// 快速排序
    /// </summary>
    /// <param name="arr"></param>
    /// <param name="p"></param>
    /// <param name="q"></param>
    public void quickSort(int[] arr, int p , int q){
        if(p < q){
            int r = quatition(arr, p, q);
            quickSort(arr, p, r - 1);
            quickSort(arr, r + 1, q);
        }
    }

    public int quatition(int[] arr, int p, int q){
        int rand = Random.Range(p, q);
        //随机化主元
        int x = arr[rand];
        CommonSortUtil.exchange(arr, p, rand);
        int i = p;
        for(int j = i + 1; j <= q; j++){
            if(arr[j] < x){
                i++;
                CommonSortUtil.exchange(arr, i, j);
                //exchange(arr, i, j);
            }
        }
        CommonSortUtil.exchange(arr, i, p);

        return i;
    }

其中CommonSortUtil.exchange(arr, i, j)方法为静态方法,功能是交换arr数组中的arr[i]和arr[j]的值。

点赞