排序算法——快速排序

前言

今天又重新学习了一下交换排序算法,这周四的时候进行过一次学习,但是还有一些地方不是很清楚,其他的都比较简单易懂最重要的就是快速排序了。首先介绍一下快速排序,它是一种排序算法,时间复杂度为O(n*lgn),最坏情况O(n^2)通常是用于排序的最佳选择。是现在应用最广泛的的一种算法。

举例

举例说明一下吧,这个可能不是太好理解。假设要排序的序列为

2 2 4 9 3 6 7 1 5 首先用2当作基准,使用i j两个指针分别从两边进行扫描,把比2小的元素和比2大的元素分开。首先比较2和5,5比2大,j左移

2 2 4 9 3 6 7 1 5 比较2和1,1小于2,所以把1放在2的位置

2 1 4 9 3 6 7 1 5 比较2和4,4大于2,因此将4移动到后面

2 1 4 9 3 6 7 4 5 比较2和7,2和6,2和3,2和9,全部大于2,满足条件,因此不变

经过第一轮的快速排序,元素变为下面的样子

[1] 2 [4 9 3 6 7 5]

static void QuickSort(ref List<int> nums, int left, int right)
    {
        if (left < right)
        {
            int i = left;
            int j = right - 1;
            int middle = nums[(left + right) / 2];
            while (true)
            {
                while (i < right && nums[i] < middle) { i++; };
                while (j > 0 && nums[j] > middle) { j--; };
                if (i == j) break;
                nums[i] = nums[i] + nums[j];
                nums[j] = nums[i] - nums[j];
                nums[i] = nums[i] - nums[j];
                if (nums[i] == nums[j]) j--;
            }
            QuickSort(ref nums, left, i);
            QuickSort(ref nums, i + 1, right);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值