数据结构之快速排序

来源:互联网 发布:数据库表设计教材 编辑:程序博客网 时间:2024/06/05 13:29

          快速排序是交换排序的一种,实质上是对冒泡排序的一种改进。它的基本思想是:在 n 个记录中取某一个记录的键值为标准,通常取第一个记录的键值为基准,通过一趟排序将待排序的记录分为小于或大于这个键值的两个独立的部分,这时一部分的记录键值均比另一部分记录的键值小,然后对这两部分记录继续分别进行快速排序,已达到整个序列有序。

那么一趟排序的具体过程是如何操作的呢?我们边用一组数来排序,一边来理它的操作步骤:这里有几个数为:45 38 66 90 88 10 2545


附设两个指针 i 和 j ,它们的初值分别为 1 和 n ,且把R[1]送入一个临时变量temp里保存。这时R[1]空出了空间。以上面的数来说,即先将第一个数45保存到临时变量temp里,这时第一个位置空出。

首先 j 从 n 起逐渐减小找到第一个满足R[j].key < temp.key 的记录,这时将R[j]移至R[i]的位置;这时R[j]空出了空间。以上面的数来说,即j 从45 开始向左直到找出小于临时变量里存放的45,显然符合条件的这个数为 25 ,这时将 25 移至 第一个位置,这时空出了原来25所在位置的空间。这一趟走完后,这组数的序列变成:

25 38 66 90 88 10 空45


              然后令 i 自 i+1 起逐渐增大找到第一个满足 R[i].key>temp.key的记录,这时将R[i] 移至 R[j] 的位置;接着 j 自 j-1 起重复上述过程,直至 i = j,此时i便是记录temp所应在的位置。

以上面的数来说,即从R[2],也就是38开始,直到找到第一个大于temp里面保存的45,显然满足条件的数是66,然后将66移至上一轮空出的R[j]的位置。这一趟走完后,这组数的序列变成:

25 38  空 90 88 10 6645


             然后再从10开始找出第一个小于临时变量temp里保存的45,显然满足条件的数为10,移至上一轮空出的位置,这一趟走完后,这组数的序列变成:

25 38 10 90 88 空 6645


接着继续从90开始找大于temp里保存的45,显然满足条件的数为90,移至上一轮空出的位置,这一趟走完后,这组数的序列变成:

25 38 10 空 88 90 6645


接着再从88找小于45的数,显然这时已经没有符合条件的数了。所以,空的位置,就是temp里数的正确位置。则最后序列变成:

25 38 10 45 88 90 66 45

这时再看这组数,就达到了我们的目的:45前面的数都比45小,而其后面的数都比45大。然后再分别对这前后两部分用这种方式排序,直至整个序列有序。


这就是快速排序的过程,赶紧拿起笔来试试吧!