基本思想:
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
1.设置 low=0, high=N-1。
2.选择一个基准元素赋值给temp,即temp=a[low]。
3.从high开始向前搜索,即由后开始向前搜索(high--),找到第一个小于temp的值,将a[high]和a[low]交换。
4.从low开始向前后搜索,即由前开始向后搜索(low++),找到第一个大于temp的值,将a[high]和a[low]交换。
5.重复第3步和第4步,直到 low==high ,3,4步中,若没找到符合条件的值,执行 high-- 或 low++ ,直到找到为止。进行交换时 low和high的位置不变。当low==high时循环结束。
基准点的选取:固定切分、随机切分、三取样切分。
快速排序是不稳定的
快速排序在序列元素很少时,效率比较低。因此,元素较少时,可选择使用插入排序。
Java实现:
package sort; /** * 快速排序的实现 * @author 那一季的银杏叶 * */ public class QuickSort { public static void main(String[] args) { // TODO Auto-generated method stub new QuickSort().run(); } public void run(){ int a[] = {3,1,5,7,2,4,9,6}; int n = a.length; System.out.println("———————————————————快速排序算法—————————————————————"); if(n>0){ quickSort(a, 0, n - 1); } for(int i=0;i<a.length;i++){ System.out.print(a[i]+" "); } System.out.println(); } /** * 快速排序 * 快速排序 时间复杂度为O(NlogN). */ private void quickSort(int[] a,int low,int high){ if (low < high) { /** * 将数组a一分为二 */ int middle = getMiddle(a, low, high); /** * 将小于基准元素的数据进行递归排序 */ quickSort(a, low, middle - 1); /** * 将大于基准元素的数据进行递归排序 */ quickSort(a, middle + 1, high); } } public int getMiddle(int[] list, int low, int high) { /** * 数组的第一个数为基准元素 */ int temp = list[low]; while (low < high) { while (low < high && list[high] > temp) { high--; } /** * 比基准小的数据移到低端 */ list[low] = list[high]; while (low < high && list[low] < temp) { low++; } /** * 比基准大的记录移到高端 */ list[high] = list[low]; } /** * 此时 low == high */ list[low] = temp; return low; } }
运行结果展示:
(本文仅供学习交流,如有更好的思路,欢迎留下意见供大家探讨学习~)