Java常用算法之快速排序

来源:互联网 发布:java如何实现线程 编辑:程序博客网 时间:2024/06/06 03:41

快速排序,它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

import java.util.Arrays;public class text {public static void main(String[] args) {// TODO Auto-generated method stubint array[]=new int[]{55,45,5,1,84,1,4,24,84,6,18,4,14};sort(array,0,array.length-1);System.out.println(Arrays.toString(array));}public static void sort(int array[],int left,int right){if(left>=right)return; int index=pat(array,left,right);//获得中间值索引;sort(array,left,index-1);//将数组分成左右两部分;sort(array,index+1,right);}public static int pat(int a[],int left,int right){int key=a[left];//将数组最左值作为分割数组的中间值while(left<right){while(a[right]>=key&&right>left)//从右侧扫描,比中间值大的放在右边;{right--;}a[left]=a[right];while(a[left]<=key&&right>left)//从左侧扫描,比中间值小的放左边;{left++;}a[right]=a[left];}a[left]=key;return left;//返回中间值索引;}}

最坏情况是枢纽元为最大或者最小数字,那么所有数都划分到一个序列去了 时间复杂度为O(n^2),与冒泡排序相同。快速排序其实就是冒泡排序的改进,最好的情况是枢纽元选取得当,每次都能均匀的划分序列。 时间复杂度O(nlogn)

针对这一缺点,对快速排序法进行改进,选用待排数组最左边、最右边和最中间的三个元素的中间值作为中轴,减少最坏情况发生的几率,另一种优化改进是当分区的规模达到一定小时,便停止快速排序算法。也即快速排序算法的最终产物是一个“几乎”排序完成的有序数列。数列中有部分元素并没有排到最终的有序序列的位置上,但是这种元素并不多。可以对这种“几乎”完成排序的数列使用插入排序算法进行排序以最终完成整个排序过程。因为插入排序对于这种“几乎”完成的排序数列有着接近线性的复杂度。这一改进被证明比持续使用快速排序算法要有效的多。
  另一种快速排序的改进策略是在递归排序子分区的时候,总是选择优先排序那个最小的分区。这个选择能够更加有效的利用存储空间从而从整体上加速算法的执行。