快排的两种写法
快排方法一:
附:全代码实现
#include<iostream> #include<assert.h> using namespace std; int OnceSort(int *a, int left, int right) { int i = 0; int middle = right; right -= 1; while (left < right) { //left找大于middle的数 while (left < right && *(a + left) <= *(a + middle)) left++; //right找小于middle的数 while (left < right && *(a + right) > *(a + middle)) right--; if (left < right) { swap(*(a + left), *(a + right)); } else { break; } } if (*(a + left) < *(a + middle)) { i = left + 1; } else { i = left; } while (i < middle) { swap(*(a + middle - 1), *(a + middle)); middle--; } return i; } void QuickSort(int* a, int left, int right) { assert(a); int middle = 0; if (left < right) { middle = OnceSort(a, left, right); QuickSort(a, left, middle - 1); QuickSort(a, middle + 1, right); } } int main() { // int a[] = { 6, 5, 4, 1, 4, 2, 4, 3 }; int a[] = { 9, 9, 9, 7, 7, 7, 8, 8, 8, 3, 2, 1, 8, 6 }; QuickSort(a, 0, sizeof(a) / sizeof(a[0]) - 1); return 0; }
快排方法二:
代码实现,下附:
#include<iostream> using namespace std; int onceSort(int a[], int left, int right) { int key = a[left]; while (left < right) { while (left < right && (*(a + right) >= key)) { right--; } if (left < right && (*(a + right) < key)) swap(*(a + right), *(a + left)); while (left < right && (*(a + left) < key)) { left++; } if (left < right && (*(a + left) >= key)) swap(*(a + left), *(a + right)); } a[left] = key; return left; } void QuickSort(int a[], int left, int right) { int middle = 0; if (left < right) { middle = onceSort(a, left, right); QuickSort(a, left, middle - 1); QuickSort(a, middle + 1, right); } } int main() { int a[] = {2,1,4,3,8,7,5,6,4,4,4,4,4}; QuickSort(a, 0, sizeof(a) / sizeof(a[0]) - 1); return 0; }