快速排序算法(一)

时间:2021-11-10 11:59:55

1. 快速排序算法简介  

  快速排序方法是对冒泡排序的一种改进,基本思想是将待排序序列分成两部分,使其中一部分的记录都比另一部分的小,随后分别对这两部分再进行重复划分,最终使得整个序列有序。

  该方法的基本思想是:(分治策略)

  1. 先从数列中取出一个数作为基准数;
  2. 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边;
  3. 再对左右区间重复第二步,直到各区间只有一个数。

  设置low,high两个指针,分别指向序列的第一个记录和最后一个记录。此时low指向了序列的第一个记录,也就是枢轴的位置。

  以序列{49,38,65,97,76,13,27,49,55,04}为例,第一趟排序过程如下图所示。图中黑线圈代表指针low,虚线圈代表指针high。

快速排序算法(一)

第一趟排序的过程

快速排序算法(一)

第二趟排序的过程

快速排序算法(一)

第三趟排序的过程

  经过三趟排序之后,整个序列就已经排序完成。

  在CSDN的一篇博客中,作者将快速排序算法总结为:挖坑填数+分治法。(http://blog.csdn.net/morewindows/article/details/6684558)

  挖坑填数:

  1. i =L; j = R; 将基准数挖出形成第一个坑a[i];
  2. j--由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中;
  3. i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中;
  4. 再重复执行2,3二步,直到i==j,将基准数填入a[i]中。

2. 相关代码

 1 //快速排序  
 2 //arr:数组首地址;l:low指针位置;r:high指针位置
 3 void quicksort(int *arr, int l, int r)
 4 {
 5     if (l < r)
 6     {
 7         int i = l, j = r, x = arr[l];
 8         while (i < j)
 9         {
10             while (i < j && arr[j] >= x) // 从右向左找第一个小于x的数  
11                 j--;
12             if (i < j)
13                 arr[i++] = arr[j];
14 
15             while (i < j && arr[i] < x) // 从左向右找第一个大于等于x的数  
16                 i++;
17             if (i < j)
18                 arr[j--] = arr[i];
19         }
20         arr[i] = x;
21         quicksort(arr, l, i - 1); // 递归调用   
22         quicksort(arr, i + 1, r);
23     }
24 }