#include <iostream> using namespace std; // 快速排序的实现基于分治法,具体分为三个步骤。假设待排序的序列为L[m..n]。 // 分解:序列L[m .. n]被划分成两个可能为空的子序列L[m .. pivot-1]和L[pivot+1 .. n], // 使L[m .. pivot-1]的每个元素均小于或等于L[pivot],同时L[pivot+1.. n]的每个元素均大于L[pivot]。 // 其中L[pivot]称为这一趟分割中的主元(也称为枢轴、支点)。 // 解决:通过递归调用快速排序,对子序列L[m .. pivot-1]和L[pivot+1 .. r]排序。 // 合并:由于两个子序列是就地排序的,所以对它们的合并不需要操作,整个序列L[m .. n]已排好序。 //算法在最坏的情况下运行时间为O(n^2), //但由于平均运行时间为O(nlogn), //并且在内存使用、程序实现复杂性上表现优秀, //尤其是对快速排序算法进行随机化的可能, //使得快速排序在一般情况下是最实用的排序方法之一。 //快速排序 void quick_sort(int a[],int low, int high) { int i,j,pivot; if (low < high) { pivot = a[low]; i = low; j = high; while (i < j) { //从顶端开始比较值,如果小于标准值,停止 while (i < j && a[j] >= pivot) { j--; } //将比pivot小的元素移到低端,下标加加 if (i < j) a[i++] = a[j]; //从底端开始比较值,如果大于标准值,停止 while (i < j && a[i] <= pivot) { i++; } //将比pivot大的元素移到顶端,下标减减 if (i < j) a[j--] = a[i]; } //pivot移动到最终位置 a[i] = pivot; //对左区间进行递归排序 quick_sort(a, low, i-1); //对右区间进行递归排序 quick_sort(a, i+1, high); } } void print_array(int a[], int n) { for(int i = 0; i < n; i++) { cout << a[i] << ","; } } int main() { int data[9] = {54,38,96,23,15,72,60,45,83}; quick_sort(data, 0, 8); print_array(data,9); return 0; }