手写QuickSort算法

举报
实力程序员 发表于 2021/07/15 10:45:18 2021/07/15
【摘要】 快速排序(QuickSort),是一种比较经典的排序算法,在很多基础库中都有实现。今天给大家介绍一下快速排序(QuickSort)原理,并且咱们自己动手实现一把。QuickSort的原理如下:我们先从数组中取一个基准元素,然后通过多次比较和元素交换,最终找到一个位置,使得左侧元素都比这个基准元素小,右侧元素都比这个基准元素大。然后把基准元素放到这个位置上,这个位置,就是这个基准元素在最终排好...

快速排序(QuickSort),是一种比较经典的排序算法,在很多基础库中都有实现。

今天给大家介绍一下快速排序(QuickSort)原理,并且咱们自己动手实现一把。

QuickSort的原理如下:

我们先从数组中取一个基准元素,然后通过多次比较和元素交换,最终找到一个位置,使得左侧元素都比这个基准元素小,右侧元素都比这个基准元素大。然后把基准元素放到这个位置上,这个位置,就是这个基准元素在最终排好序的数组中的位置,因此它就不需要变动了。
然后,我们左侧和右侧分别变成一个数组,应用上面的方法,对其进行排序。
最终,每个元素都找到并被放置到相应的位置。
当被排序的数组元素长度为0时,排序结束。

基准元素的选取,可以取最左边,可以取最右边,当然也可以取随机数。通常我们取最左边的那个数。

下面用一个整数数组,来展示一下QuickSort排序的实现过程:

2021-07-15_1.jpg


1)我们取最左侧的元素为基准元素,把元素的值记录到base中。被排序数组元素的最小下标为low, 最大下标为high,用两个不同颜色的箭头表示。

2021-07-15_2.jpg

2)在区间[low..high],从high向low的方向,查找比base小的元素,发现第一个即停止。查找过程会移动high,最终high会停在比base小的元素位置上。

2021-07-15_3.jpg

3)将high位置的元素,赋值给low位置的元素。这步的目的,是将比base小的元素,都放到左边。

2021-07-15_4.jpg

4)在区间[low..high],从low向high的方向,查找比base大的元素,发现第一个即停止。查找过程会移动low,最终low会停在比base小的元素位置上。

2021-07-15_5.jpg

5)将low位置的元素,赋值给high位置的元素。这步的目的,是将比base大的元素,都放到右边。

2021-07-15_6.jpg

6)循环执行步骤2)~5),直至low和high相等。

2021-07-15_7.jpg

7) 将low位置的元素值,改为base。这个位置,就是基准元素的最终位置。

2021-07-15_8.jpg

8) low位置左右两边,各形成一个数组。对这个两个数组,再次应用上述从1)到7)的排序算法,这样整个数组就排好序了。

2021-07-15_9.jpg


上述原理,C语言代码实现,如下:

void quick_sort(int* parr, int left, int right) {
    if (left >= right) {
        return;
    }

    int low = left;
    int high = right;
    int base = parr[low];

    while (low < high) {
        while ((low < high) && (parr[high] >= base)) {
            high--;
        }
        parr[low] = parr[high];


        while ((low < high) && (parr[low] < base)) {
            low++;
        }
        parr[high] = parr[low];
    }

    parr[low] = base;
    quick_sort(parr, left, low-1);
    quick_sort(parr, low+1, right);
}


我的微信号是 实力程序员,欢迎大家转发至朋友圈,分享给更多的朋友。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。