快速排序的基本思想(图文详解)
创始人
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);
}

相关内容

热门资讯

Python|位运算|数组|动... 目录 1、只出现一次的数字(位运算,数组) 示例 选项代...
张岱的人物生平 张岱的人物生平张岱(414年-484年),字景山,吴郡吴县(今江苏苏州)人。南朝齐大臣。祖父张敞,东...
西游西后传演员女人物 西游西后传演员女人物西游西后传演员女人物 孙悟空 六小龄童 唐僧 徐少华 ...
名人故事中贾岛作诗内容简介 名人故事中贾岛作诗内容简介有一次,贾岛骑驴闯了官道.他正琢磨着一句诗,名叫《题李凝幽居》全诗如下:闲...
和男朋友一起优秀的文案? 和男朋友一起优秀的文案?1.希望是惟一所有的人都共同享有的好处;一无所有的人,仍拥有希望。2.生活,...
戴玉手镯的好处 戴玉手镯好还是... 戴玉手镯的好处 戴玉手镯好还是碧玺好 女人戴玉?戴玉好还是碧玺好点佩戴手镯,以和田玉手镯为佳!相嫌滑...
依然什么意思? 依然什么意思?依然(汉语词语)依然,汉语词汇。拼音:yī    rán基本解释:副词,指照往常、依旧...
高尔基的散文诗 高尔基的散文诗《海燕》、《大学》、《母亲》、《童年》这些都是比较出名的一些代表作。
心在飞扬作者简介 心在飞扬作者简介心在飞扬作者简介如下。根据相关公开资料查询,心在飞扬是一位优秀的小说作者,他的小说作...
卡什坦卡的故事赏析? 卡什坦卡的故事赏析?讲了一只小狗的故事, 我也是近来才读到这篇小说. 作家对动物的拟人描写真是惟妙...
林绍涛为简艾拿绿豆糕是哪一集 林绍涛为简艾拿绿豆糕是哪一集第三十二集。 贾宽认为是阎帅间接导致刘映霞住了院,第二天上班,他按捺不...
小爱同学是女生吗小安同学什么意... 小爱同学是女生吗小安同学什么意思 小爱同学,小安同学说你是女生。小安是男的。
内分泌失调导致脸上长斑,怎么调... 内分泌失调导致脸上长斑,怎么调理内分泌失调导致脸上长斑,怎么调理先调理内分泌,去看中医吧,另外用好的...
《魔幻仙境》刺客,骑士人物属性... 《魔幻仙境》刺客,骑士人物属性加点魔幻仙境骑士2功1体质
很喜欢她,该怎么办? 很喜欢她,该怎么办?太冷静了!! 太理智了!爱情是需要冲劲的~不要考虑着考虑那~否则缘...
言情小说作家 言情小说作家我比较喜欢匪我思存的,很虐,很悲,还有梅子黄时雨,笙离,叶萱,还有安宁的《温暖的玄》 小...
两个以名人的名字命名的风景名胜... 两个以名人的名字命名的风景名胜?快太白楼,李白。尚志公园,赵尚志。
幼儿教育的代表人物及其著作 幼儿教育的代表人物及其著作卡尔威特的《卡尔威特的教育》,小卡尔威特,他儿子成了天才后写的《小卡尔威特...
海贼王中为什么说路飞打凯多靠霸... 海贼王中为什么说路飞打凯多靠霸气升级?凯多是靠霸气升级吗?因为之前刚到时确实打不过人家因为路飞的实力...
运气不好拜财神有用吗运气不好拜... 运气不好拜财神有用吗运气不好拜财神有没有用1、运气不好拜财神有用。2、拜财神上香前先点蜡烛,照亮人神...