快速排序
本文最后更新于 169 天前,其中的信息可能已经有所发展或是发生改变。

快排的平均时间复杂度为O(nlogn),最坏时间复杂度为O(n²),空间复杂度为O(1),快排是不稳定的。快排适用于乱序数组,排序快。快排面临的最坏情况就是排序一个已经排序好的数组。

快排的基本概念:选取一个元素作为基准,然后调整元素位置,使得基准左边的元素都小于他,右边的都大于他,然后递归执行,即可排序完整个数组。每一趟基本流程:

  1. 选取最左侧元素作为基准(pivot)
  2. 两个指针,一个left初始指向最左边,right初始指向最右边
  3. 如果left等于right,说明这一趟排序完成,将该位置的元素值改为pivot,进行下一趟。否则执行流程4
  4. right指向元素与left不重合或者大于等于pivot时,right会一直向左边移动,直到不满足条件时,停止移动(为了确保right右边的都是大于等于pivot的元素)
  5. 将left指向元素的值改为right指向元素
  6. left指向元素与right不重合或者小于pivot时,left会一直向右边移动,直到不满足条件时停止移动(为了确保left左边的元素都是小于pivot)
  7. 将right指向元素的值改为left指向元素
  8. 跳转到流程3

以书上的例题举例,排序49,38,65,97,76,13,27,49

第一趟就详细说明吧。

先选取49作为pivot

然后是right指针先往左移动,先判断49不会小于49,然后左移发现27小于49,终止移动。

然后赋值之后数组变成27(left指向),38,65,97,76,13,27(right指向),49

再然后left右移,移到65的时候停下,然后修改right指向元素的值。此时数组为27,38,65(left指向),97,76,13,65(right指向),49

再然后,left和right还没重合,继续right左移。移动到13的时候修改left指向元素的值,此时数组为27,38,13(left指向),97,76,13(right指向),65,49

然后left右移到97的时候修改right指向元素的值。此时数组为27,38,13,97(left指向),76,97(right指向),65,49

然后right左移,直到和left重合,此时将该位置元素改为pivot,数组为:27,38,13,49(left和right指向),76,97,65,49

那么继续递归排序27,38,13和76,97,65,49这两个子数组。

以此类推,直到排序完整个数组。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇