标签:
1. 快速排序算法
1.1 算法步骤:
1> 从数列中挑出一个元素,称为 “基准”(pivot),
2 > 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
3 > 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去
1.2 算法代码:
1 void QuickSort(Rectype R[], int s, int t) // 对R[]到R[]区间内的元素进行快速排序
2 {
3 int i = s;
4 int j = t;
5 Rectype tmp;
6 if(s < t) // 区间内至少存在两个元素的情况
7 {
8 tmp = R[s]; // 区间内的第一个元素作为基准即R[0]
9 while(i!=j) // 从区间的两段交替向中间扫描,知道i=j为止
10 {
11 while(j>i && R[j].key>tmp.key)// 从右往左扫描,找到第一个小于tmp.key的元素R[i]
12 j--;
13 R[i] = R[j]; // 把之前弄出来的坑填上,自己形成一个坑
14
15 while(i<j && R[i].key>tmp.key)// 从左往右扫描,找到第一个大于tmp.key的元素R[j]
16 i++;
17 R[j] = R[i]; // 把上一次循环形成的坑填上,自己形成一个坑
18 }
19
20 R[i] = tmp; // 基准元素归位
21
22 QuickSort(R, s, i-1); // 对左区间递归
23 QuickSort(R, i+1, t); // 对右区间递归
24 }
25 }
1.3 算法解析:
链接如下: http://blog.csdn.net/morewindows/article/details/6684558
标签:
原文地址:http://www.cnblogs.com/gossiplee/p/4489015.html