快速排序_C#

快速排序:
快速排序思路:

原列表 574631298
取一个元素p(第一个元素),使元素p归位;取5

并且当前列表被p分成两部分,左边都比p小,右边都比p大;列表变成 214356789

最后递归完成排序。123456789

 首先完成框架

    //快速排序框架
    public void QuickSort(List<int> li,int left,int right)
    {
        int mid = 0;
        if (left<right)
        {
            mid = Partition(li,  left, right);//归位过程
            QuickSort(li,left,mid-1);
            QuickSort(li, mid+1, right);
        }
    }

接着是具体怎么归位

  public int Partition(List<int> li, int left, int right)
    {
        int tmp = li[left];//取出最左边的元素,留一个空位
        while (left<right)
        {
            while (left < right&&li[right]>=tmp)//从右边开始找比这个元素小的数
            {
                right--;//往右移
            }
            li[left] = li[right];//把找到的值写入左边元素的空位,那么同样右边会留下一个空位
            while (left < right && li[left] <= tmp)//从左边开始找比这个元素小的数
            {
                left++;//往右移
            }
            li[right] = li[left];//把找到的值写入左边元素的空位
        }
        li[left] = tmp;//最后把元素填回去
        return left;
    }

 首先测试一次归位

 

        List<int> li = new List<int> { 5,7,4,6,3,1,2,9,8 };
        Partition(li,0,li.Count-1);
        StringBuilder sb = new StringBuilder();
        foreach (var item in li)
        {
            sb.Append(item);
        }
        Debug.Log(sb);

 

ok没问题 

接着测试一遍排序 

OK也没问题 

然后我们来分析一下快速排序的时间效率,很明显O(nlogn) (可能会开个坑简单讲讲怎么快速分析时间效率)

但是 ,出现了!,鲁迅经典但是!

还有一种最坏情况,时间效率会变成O(n2) 

也就是对于{9,8,7,6,5,4,3,2,1}有序降序列表,每次归位只会移动一个元素,最后导致一共移动N次,最后时间效率变成N2

有一个很简单的解决方法就是,先在列表中取一个随机数,和第一个元素交换  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值