因为是经典的算法,所以网上描述一大把,直接上个图,直观些,给记性不好的菜鸟(如我)一点儿提示。
快速排序是冒泡排序的一种改进。通过轴值的选择方法不同,算法的速度也不一样。本文下面的代码采取选择最左边的数值为轴值的方法。
同时算法的优化可以考虑在对小子串排序的时候,不采用递归的快速排序,而是用例如插入算法来排序,可以提升效率。
此外,还可以通过使用队列或者栈,实现无递归的快速排序来提升效率。
下面是代码(欢迎批评指点,之后应该会放到github上:https://github.com/y277an/princeton_algs4):
//---------------------------------Specification of Program------------------------------ // Program Name:快速排序 // Tools:VS_2013 // Language: C++ // Description: 可自由输入,不需要提早知道数据长度 // Date:2016.3.21 // Author:mseddl //---------------------------------------------------------------------------------------- #include <iostream> using namespace std; void QuickSort(int *arr, int low, int high) { int nStart = low; int nEnd = high; if (nStart >= nEnd) { return; } int nKey = arr[nStart];//以集合最左边数为枢轴 int flag; while (nStart < nEnd) { flag = nStart;//记录枢轴的位置 while (nStart < nEnd && arr[nEnd] >= nKey) { nEnd--; } while (nStart < nEnd &&arr[nStart] <= nKey) { nStart++; } arr[flag] = arr[nEnd]; arr[nEnd] = arr[nStart]; arr[nStart] = nKey; } //递归 QuickSort(arr, low, nStart - 1); QuickSort(arr, nStart + 1, high); } int main() { int len(0), temp; int *arr = new int[100]; char ch; cout << "请输入要排序的数字,以空格隔开:"; while (1) { cin >> temp; arr[len++] = temp; cin.get(ch); if (ch == '\n') { break; } } QuickSort(arr, 0, len - 1); cout << "排序后的数字为:"; for (int i = 0; i < len; i++) { cout << arr[i] << " "; } cout << endl; delete[] arr; }