void QSort(int * a,int begin,int end) { if(begin < end) { int i = begin; int j = end+1; //关键 int k = a[i],tmp; while(i < j) // { i = i + 1; while(a[i] < k) i ++; j = j - 1; while(a[j] > k) j --; if(i < j) { tmp = a[i]; a[i] = a[j]; a[j] = tmp; } } tmp = a[begin]; //注意此时a[begin] 与 a[j] 交换 a[begin] = a[j]; a[j] = tmp; QSort(a,begin,j - 1); QSort(a,j + 1,end); } }
上是最简单的快速排序版本
/* 插入排序 */ void insertSort(int * a,int begin,int end) { int tmp; for(int j = begin + 1;j<= end;j++) { tmp = a[j]; int i = j -1; //while(a[i] < a[j]) //不能这么写,因为a[i] 会被覆盖掉,此时的a[i]已不是彼时的a[i] while(tmp < a[i]) { a[i + 1] = a[i]; i --; } a[i + 1] = tmp; } } /* 这个算法来自sgi stl */ int middle(int a,int b,int c) { if(a < b) //其实就是在这个大的条件下,依次return b ,c a { if(b < c) // a < b < c return b; else if(a < c) // a < b ; b > = c ; a < c return c; else // a < b ; a >= c return a; } else { if(b > c) // a > b > c return b; else if(a > c) // a > b ;b <= c; return c; else // a > b ; a < c return a; } } /* 首先,分划元素k 取得是a[begin],a[middel],a[end]的中值 其次,如果分得的子数组长度小于等于3,则调用insertSort */ void AdvancedQSort(int * a,int begin,int end) { if(begin >= end) return ; if(end - begin <= 3) insertSort(a,begin,end); else { int i = begin,j = end,k = middle(a[i],a[j],a[(i + i) / 2]),tmp; while(i < j) // { i = i + 1; while(a[i] < k) i ++; j = j - 1; while(a[j] > k) j --; if(i < j) { tmp = a[i]; a[i] = a[j]; a[j] = tmp; } } tmp = a[begin]; //注意此时a[begin] 与 a[j] 交换 a[begin] = a[j]; a[j] = tmp; AdvancedQSort(a,begin,j - 1); AdvancedQSort(a,j + 1,end); } }