快速排序 ——双游标、单游标实现
#include <cstdio> #include <iostream> using namespace std; // 双游标版本 int* partition(int *l, int *r) { int *i = l+1, *j = r-1; int aim = *l, temp; while(i<=j) { while(i<=j && *i<=aim) i++; while(i<=j && *j>aim) j--; if(i<=j) { temp = *i; *i = *j; *j = temp; i++; j--; } } temp = *l; *l = *j; *j = temp; } // 单游标版本 1 // 维护这样一个区间 [ <=aim | >aim | unknown], k指向第一个>aim的位置 int* partition2(int *l, int *r) { int *k = l+1; int aim = *l, temp; for(int *p=l+1; p < r; p++) { if(*p <= aim) { temp = *p; *p = *k; *k = temp; k++; } } temp = *(k-1); *(k-1) = *l; *l = temp; // for(int *p=l; p < r; p++) { // printf("%d ", *p); // } // printf("\n"); return k-1; } // 单游标版本 2 // 维护这样一个区间 [ <=aim | >aim | unknown], k指向最后一个<=aim的位置 int* partition3(int *l, int *r) { int *k = l; int aim = *l, temp; for(int *p=l+1; p < r; p++) { if(*p <= aim) { temp = *p; *p = *(k+1); *(k+1) = temp; k++; } } temp = *k; *k = *l; *l = temp; // for(int *p=l; p<r; p++) { // printf("%d ", *p); // } // printf("\n"); return k; } void quick_sort(int *l, int *r) { if(r-l<2) return; // 只有当序列长度>=2时,才需要排序 // int *mid = partition(l, r); int *mid = partition3(l, r); quick_sort(l, mid); quick_sort(mid+1, r); } int main () { int a[] = {6,2,1,8,7,5,3,4}; // int a[] = {2,4,3,1}; int n = sizeof(a) / sizeof(int); quick_sort(a, a+n); for(int i=0; i<n; i++) printf("%d ", a[i]); return 0; }