#include<iostream> using namespace std; const int M = 20; void quickSort(int *data,const int left,const int right); int partition(int *data,const int low,const int high); void insertSort(int *data,const int left,const int right); void swap(int &a,int &b); int main() { int size = 0; cin >> size; if (size > 100 || size < 1) return 0; int *data = new int[size]; for (int i = 0; i < size; ++i) cin >> data[i]; quickSort(data,0,size-1); for (int i = 0; i < size; ++i) cout << data[i] << " "; return 0; } void quickSort(int *data, const int left, const int right) { if (right - left < M) insertSort(data,left,right); //if (right <= left) //return; else { int pivotPos = partition(data,left,right); quickSort(data,left,pivotPos-1); quickSort(data,pivotPos+1,right); } } int partition(int *data, const int low, const int high) { int pivotPos = low; int pivotValue = data[low]; for (int i = low+1; i <= high; ++i) { if (pivotPos == i) continue; if (pivotValue > data[i]) { swap(data[++pivotPos], data[i]); } } data[low] = data[pivotPos]; data[pivotPos] = pivotValue; return pivotPos; } void swap(int &a, int &b) { int temp = a; a = b; b = temp; } void insertSort(int *data, const int left, const int right) { int current = 0; for (int i = left+1; i <= right; ++i) { current = data[i]; int j; for (j = i-1; j >=left; --j) { if (current < data[j]) { data[j + 1] = data[j]; } else { break; } } data[j+1] = current; } }
对于长度比较小的序列,快排并不比简单的排序算法快,因此加了一个插入排序(当序列长度小于20时用插入排序)。
研究表明,序列长度取值为5——25时,采用直接插入排序要比快排至少快10%。