直接上代码:
void InsertSort(int *array, int n) { int tmp; int j; for (int p = 1; p < n; p++) { tmp = array[p]; for (j = p; j > 0 && array[j - 1] > tmp; j--) { array[j] = array[j - 1]; } array[j] = tmp; } } int Median3(int *array, int left, int right) { int middle = (left + right) / 2; if (array[left] > array[middle]) std::swap(array[left], array[middle]); if (array[left] > array[right]) std::swap(array[left], array[right]); if (array[middle] > array[right]) std::swap(array[middle], array[right]); std::swap(array[middle], array[right - 1]); return array[right - 1]; } void Qsort(int *array, int left, int right) { if (left + 3 <= right) { int pivot = Median3(array, left, right); int i = left; int j = right - 1; for (; ;) { while (array[++i] < pivot) ; while (array[--j] > pivot) ; if (i < j) std::swap(array[i], array[j]); else break; } std::swap(array[i], array[right - 1]); Qsort(array, left, i - 1); Qsort(array, i + 1, right); } else { InsertSort(array + left, right - left + 1); } } void QuickSort(int *array, int n) { Qsort(array, 0, n - 1); }
pivot元素的选择,值得研究。