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
时间: 2024-08-06 18:48:23