page contents

如何进行快速排序?

轩辕小不懂 发布于 2021-10-09 15:32
阅读 524
收藏 0
分类:Golang
2111
Nen
Nen
- 程序员

快速排序是一种非常高效的排序算法,它采用“分而治之”的思想,把大的拆分为小的,小的再拆分为更小的。其原理如下:对于一组给定的记录,通过一趟排序后,将原序列分为两部分,其中前一部分的所有记录均比后一部分的所有记录小,然后再依次对前后两部分的记录进行快速排序,递归该过程,直到序列中的所有记录均有序为止。具体而言,算法步骤如下:

(1)分解:将输入的序列array[m…n]划分成两个非空子序列array [m…k]和array[k+1…n],使array [m…k]中任一元素的值不大于array [k+1…n]中任一元素的值。

(2)递归求解:通过递归调用快速排序算法分别对array [m…k]和array [k+1…n]进行排序。

(3)合并:由于对分解出的两个子序列的排序是就地进行的,所以在array [m…k]和array [k+1…n]都排好序后不需要执行任何计算array [m…n]就已排好序。以数组{38, 65, 97, 76, 13, 27, 49}为例。

第一趟排序过程如下:

初始化关键字 [49 38 65 97 76 13 27 49]

第一次交换后:[27 38 65 97 76 13 49 49]

第二次交换后:[27 38 49 97 76 13 65 49]

j向左扫描,位置不变,第三次交换后:[27 38 13 97 76 49 65 49]

i向右扫描,位置不变,第四次交换后:[27 38 13 49 76 97 65 49]

j向左扫描 [27 38 13 49 76 97 65 49]

整个排序过程如下:初始化关键字 [49 38 65 97 76 13 27 49]

一趟排序之后:[27 38 13] 49 [76 97 65 49]

二趟排序之后:[13] 27 [38] 49 [49 65]76 [97]

三趟排序之后: 13 27 38 49 49 [65]76 97

最后的排序结果:13 27 38 49 49 65 76 97

程序示例如下:

attachments-2021-10-tEG7B0KM6161511050529.jpg程序输出为:

0 1 2 3 4 5 6 7 8 9

当初始的序列整体或局部有序时,快速排序的性能将会下降,此时,快速排序将退化为冒泡排序。

请先 登录 后评论