交换排序之快速排序
快速排序(递归):
#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; #define LEN 8 // 有LEN个元素要排 #define TEST struct Record { // 为了考察排序的稳定性,定义元素是结构体类型 int key; int otherinfo; }; int Partition(Record *arr, int low, int high) { // 交换顺序表L中子序列arr[low..high]的记录,使枢轴记录到位, // 并返回其所在位置,此时,在它之前(后)的记录均不大(小)于它 int pivotkey; arr[0] = arr[low]; // 用子表的第一个记录作枢轴记录 pivotkey = arr[low].key; // 枢轴记录关键字 while (low < high) { // 从表的两端交替地向中间扫描 while (low < high && arr[high].key >= pivotkey) --high; arr[low] = arr[high]; // 将比枢轴记录小的记录移到低端 while (low < high && arr[low].key <= pivotkey) ++low; arr[high] = arr[low]; // 将比枢轴记录大的记录移到高端 } arr[low] = arr[0]; // 枢轴记录到位 return low; // 返回枢轴位置 } void QSort(Record *arr, int low, int high) { #ifndef TEST static int g_count = 1; cout << "Case " << g_count++ << ": low = " << low << " high = " << high << endl; #endif // 递归到边界时可能出现low = 1, high = 0的情况 // 对顺序表L中的子序列arr[low..high]进行快速排序 int pivotloc; if (low < high) { // 长度大于等于2 pivotloc = Partition(arr, low, high); // 将arr[low..high]一分为二 QSort(arr, low, pivotloc - 1); // 对低子表递归排序,pivotloc是枢轴位置 QSort(arr, pivotloc + 1, high); // 对高子表递归排序 } } void QuickSort(Record *arr, int length) { QSort(arr, 1, length); } int main(int argc, char **argv) { freopen("in.txt", "r", stdin); Record a[LEN + 1] = {0}; for (int i = 1; i <= LEN; i++) cin >> a[i].key >> a[i].otherinfo; QuickSort(a, LEN); for (int i = 1; i <= LEN; i++) cout << a[i].key << '\t' << a[i].otherinfo << endl; return 0; } /* if in.txt: 49 1 38 0 65 0 97 0 76 0 13 0 27 0 49 2 then out: 13 0 27 0 38 0 49 1 49 2 65 0 76 0 97 0 but if in.txt: 38 0 49 1 65 0 97 0 76 0 13 0 27 0 49 2 then out: 13 0 27 0 38 0 49 2 49 1 65 0 76 0 97 0 */
待加分析