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

随机化快速排序

快速排序是一种高效的排序方法,但是如果我们的输入数组是排好序的一个数组,快速排序的运行时间就会变成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]的值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值