快速排序的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。
稳定性:快速排序是不稳定的排序
时间复杂度: 最好:O(nlogn) 最差:O(n^2) 辅助空间:O(logn) ~ O(n)
/* 快速排序算法 */ #include <cstdio> /* 对给定的闭区间进行快速排序 */ void QSort(int* L, int low, int high){ if (low < high){ int fst = low, lst = high; int key = L[fst]; //这样fst位置就空出来了 while (fst < lst){ //从后半部分找小于key的值放到前面 while (fst < lst && L[lst] >= key) --lst; //循环结束后lst位置即为小于key的地方 L[fst] = L[lst]; //这样lst位置就空出来了 //从前面找大于key的数放到后面 while (fst < lst && L[fst] <= key) ++fst; L[lst] = L[fst]; //这样fst又空出来了 } L[fst] = key; //枢轴记录到位 QSort(L, low, fst - 1); QSort(L, fst + 1, high); } } /* 对给定的左闭右开区间进行排序 --- 指针法 */ void QSort(int* low, int* high){ //high - low = 1表示只有一个元素无须排序 if (high - low > 1){ int* fst = low; //首元素 int* lst = high - 1; //尾元素 int key = *fst; //fst空出来了 while (fst < lst){ //从后面找比key小地元素放到前面 while (fst < lst && *lst >= key) --lst; *fst = *lst; //从前面找比key大的元素放到后面 while (fst < lst && *fst <= key) ++fst; *lst = *fst; } *fst = key; //枢轴记录到位 QSort(low, fst); //递归排序左闭右开区间 QSort(fst + 1, high); //递归排序左闭右开区间 } } /* 快速排序 --- 指针法降序版 左闭右开区间 */ void QSort2(int* low, int* high){ if (high - low > 1){ int* fst = low; int* lst = high - 1; int key = *fst; //fst位置空出来 //由于是降序,则比key大的放前面,比key小的放后面 while (fst < lst){ //从后面找比key大的放前面 while (fst < lst && *lst <= key) --lst; *fst = *lst; //这样lst空出来了 //从前面找比key小地放后面 while (fst < lst && *fst >= key) ++fst; *lst = *fst; //fst空出来 } *fst = key; //枢轴记录到位 QSort2(low, fst); //递归排序左闭右开区间 QSort2(fst + 1, high); //递归排序左闭右开区间 } } int main() { //int a[10] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; QSort2(a, a+5); for (int i = 0; i < 10; ++i){ printf("%d ", a[i]); }//for(i) return 0; }
原文:http://www.cnblogs.com/tommychok/p/5043735.html