分快速排序采用的是分而治之的思想来进行的排序,测试下来比归并排序 更快一点
为什么更快一点?
我的理解:是n个元素被分成 左, 中, 右三段,中段只有一个元素,左段中各个元素都小于等于中段元素,右端中各个元素都大于等于终端元素,因此左右两端中的元素集合不仅变成了可以独立处理的小集合,而且还不必对他们在进行各自的排序后的结果再进行合并, 而归并排序多了这步,所以快速排序比归并排序更快点
分而治之的思想: 是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题类似或相同,递归的解这些子问题,然后将子问题的解合并得到原问题的解。
1:递归的实现
template<class T> void quickSort(T a[], int l, int r) { //排序 a[l:r], a[r+1]有最大值. if (l >= r) return; int i = l, // 从左至右的游标 j = r + 1; // 从右至左的游标 T pivot = a[l]; //把左侧>=pivot的元素与右侧<=pivot的元素进行交换 while (true) { do { // 在左侧寻找>=pivot的元素 i = i + 1; } while (a[i] < pivot); do { // 在右侧寻找<=pivot的元素 j = j - 1; } while (a[j] > pivot); if (i >= j) break; Swap(a[i], a[j]); } a[l] = a[j]; a[j] = pivot; quickSort(a, l, j-1); // 对左段排序 quickSort(a, j+1, r); // 对右段排序 } template<class T> void QuickSort(T *a, int n) { //对a[0:n-1]进行快速排序 //要求a[n]必须有最大关键值 quickSort(a, 0, n-1); }
2:消除第二个递归的实现
template<class T> void quickSort1(T a[], int l, int r) { //排序 a[l:r], a[r+1]有最大值. while (l < r) { int i = l, // 从左至右的游标 j = r + 1; // 从右至左的游标 T pivot = a[l]; //把左侧>=pivot的元素与右侧<=pivot的元素进行交换 while (true) { do { i = i + 1; // 在左侧寻找>=pivot的元素 } while (a[i] < pivot); do { j = j - 1; // 在右侧寻找<=pivot的元素 } while (a[j] > pivot); if (i >= j) break; Swap(a[i], a[j]); } a[l] = a[j]; a[j] = pivot; quickSort1(a, l, j-1); // 对左段排序 l = j + 1; // 调整l的值 } } template<class T> void QuickSort1(T a[], int n) { //对a[0:n-1]进行快速排序 //要求a[n]必须有最大关键值 quickSort1(a, 0, n-1); }