快速排序的基本思想(图文详解)
创始人
2024-06-02 01:44:18
0

文章目录

  • 前言
  • 一、(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。
  • 二、(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。
  • 三、(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
  • 四、(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。
  • 五、总结
  • 六、代码实现


前言

快速排序算法通过多次比较和交换来实现排序,其排序流程如下:
(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。

(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。

(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

此解释源自百度百科

接下来我一句一句的解释这四句话

一、(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。

在这里插入图片描述

我们以这几个数字为例。我们要选定一个分界值(这个过程非常简单,可以采取三数取中的方法)这篇博客的重心在于介绍快排的思想,我们就简单的以第一个数字(6)为分界值吧。
在这里插入图片描述

二、(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。

我们接下来要做的是将数组中大于等于6的数据集中到数组右边,小于分解值的数据集中到数组左边,那么怎么实现这个过程呢?

在这里插入图片描述
我们会设置两个指针,分别指向数组的左边和数组的右边。然后将两个指针不断的向中间逼近。直到它两吻合。
对于j指针而言,它要不断向左走。它的目标是找到比6小的数据,如果找到了的话就停下来。
对于指针i而言,它要不断向右走,它的目标是找到比6大的数据,如果找到的话就停下来。
然后交换i指针指向的数据和j指针指向的数据。
在这里插入图片描述

在这里插入图片描述
到这里,第一次交换就结束了,但是任务仍未结束,我们仍然无法确定两个指针中的数据满足条件。i继续向右走,j继续向左走
在这里插入图片描述

在这,i继续指向了大于6的数,重复上述操作。
在这里插入图片描述
交换完成后,j继续往左走,i继续往右走

在这里插入图片描述
此时出现了一种状况:j指向了小于分界值的数据,但i没有。但是i与j已经相遇了。此时它们相遇点的数据必定是小于分界值的。因为我们要让j先走,j遇到小于分界值的数据就会停下来。j走完才会让i走。最终相遇时就一定是小于分界值的数据。这时,我们将分界值的数据与相遇点的数据交换。
在这里插入图片描述
此时,我们就完成了单趟排序,即比分界值小的值都在它的左边,比分界值大的值都在它的右边。同时我们可以认为,分界值已经在它正确的位置了。

三、(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。

在这里插入图片描述
到这里,我们对上一步分界值的左边一部分数据进行与第二步类似的处理。
一、选出分界值。
二、将小于分界值的数据放到左边,大于分界值的数据放到右边。

四、(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

五、总结

在上述过程中,有几个需要注意的点。
1.必须要让j先走。这是为了确保i和j相遇时指向的一定是比分界值小的数。
2.单趟排序之后,分界值就到了它应该到的位置(这句话的意思理解一下就是:这个分界值已经到了终点了。后续也不会再管它了)

六、代码实现

void Quick_Sort(int *arr, int begin, int end){if(begin > end)return;int tmp = arr[begin];int i = begin;int j = end;while(i != j){while(arr[j] >= tmp && j > i)j--;while(arr[i] <= tmp && j > i)i++;if(j > i){int t = arr[i];arr[i] = arr[j];arr[j] = t;}}arr[begin] = arr[i];arr[i] = tmp;Quick_Sort(arr, begin, i-1);Quick_Sort(arr, i+1, end);
}

相关内容

热门资讯

高温+入伏!下周热度继续升级,... 转自:中国天气网下周,盛夏时节的雨和热都将趋于鼎盛。15日至16日将是本轮大范围高温天气的强盛时段,...
招商证券:建议关注高景气TMT... 转自:财联社【招商证券:建议关注高景气TMT领域、具有全球竞争力的中游制造、内需领域和其他业绩预喜板...
股市回暖助力权益基金发行加速 (转自:ETF炼金师)  近期,公募基金市场的发行活动显著加快,尤其是在股市回暖的背景下。根据最新数...
从“卖原粮”到“卖产品”“卖品... 转自:新华社“这是铁岭大米”“你抓一把拿手搓,搓热了闻一闻”“咱家的米香很清新”……7月12日,在沈...
中华民族家风家教传承发展展览会... 中新网珠海7月13日电 (王东海 张素)13日,第二届中华民族家风家教传承发展展览会在珠海开幕。本届...
“广播+互联网+服务”,广东交... 中国青年报客户端讯(中青报·中青网记者 林洁)7月11日,广东交通之声“大吉利车主+”小程序上线。广...
福达合金拟收购TOPCon电池... 每经记者|蔡鼎    每经编辑|董兴生     光伏银浆行业再迎重量级并购。福达合...
0.1元微利的“类水生意”,为... 文 | 娱乐资本论 亚娜烈日炎炎之下,饱受争议的冰杯又火了一把。“是我颠了吗?山姆新品上了农夫山泉冰...
解忧 | 女子因狐臭被辞退?网... 近日,一则“因狐臭被公司辞退”的求助帖引发热议。发帖女子称,自己被狐臭困扰,在公司工作近一年,虽然日...
朝鲜谴责美日韩空中联合演习 强... 人民财讯7月13日电,朝鲜国防省政策室长13日发表题为《威胁地区和平的美日韩军事勾结理应受到注视和遏...