快速排序

来源:互联网 发布:管家婆辉煌网络试用版 编辑:程序博客网 时间:2024/06/15 20:50

定义

快速排序采用递归的思想,不断将原列表拆分成两个部分,递归进行排序。排序操作为选择一个元素作为“分水岭”,将列表分成所有元素值大于该“分水岭”部分和所有元素值小于该“分水岭”部分。

示例

以整型数组{2,9,11,5,7,20,8}为例,选择第一个元素作为“分水岭”,以line表示:

原始列表:2->9->11->5->7->20->8  line=2

1次排序:2->9->11->5->7->20->8 line=9

2次排序:2->8->7->5->9->20->11 line=8

3次排序:2->5->7->8->9->20->11   line=5

4次排序:2->5->7->8->9->20->11   line=20

5次排序:2->5->7->8->9->11->20

以上为排序中间过程,递归中以列表左边部分先排序,同一颜色为拆分后的同一部分。

参考代码

class t{public static void main(String[] args){int[] arr=new int[]{2,9,11,5,7,20,8};QuickSort.sort(arr,0,arr.length-1);for(int i:arr){System.out.print(i+" ");}System.out.println();}}class QuickSort{public static void sort(int[] arr,int left,int right){if(left<right){  //递归判断条件int i=left,j=right,index=arr[i];  //index作为“分水岭”while(i<j){//列表后端保存大于index的值,前端保存小于index的值while(i<j&&arr[j]>=index){j--;}if(i<j){arr[i++]=arr[j];}while(i<j&&arr[i]<=index){i++;}if(i<j){arr[j--]=arr[i];}}arr[i]=index;//到达该步骤时,i必然等于jsort(arr,left,i-1);//递归操作列表前端sort(arr,i+1,right);//递归操作列表后端}}}

总结

快速排序将无序的列表拆分成“有序”的两个部分,使得整个列表成为包含两个“有序”部分的列表(一部分的元素值都不小于或不大于另一部分的元素值),并不断细化这些“有序”部分,最终形成有序列表。平均时间复杂度为O(n*log n),因为存在跨元素的替换,属于不稳定排序。


0 0
原创粉丝点击