排序---快速排序及其切分函数Partition应用
生活随笔
收集整理的這篇文章主要介紹了
排序---快速排序及其切分函数Partition应用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
快速排序
??快速排序通過一個切分元素將數組分成兩個子數組,左子數組小于等于切分元素,右子數組大于切分元素,將這兩個子數組排序,也就是將整個數組排序了。
代碼如下:
public class Sort{public static void quickSort(int []arr){if(arr=null||arr.length<2)return;quickSort(arr,0,arr.length-1);}public static void quickSort(int[]arr,int l,int r){if(l<r){swap(arr, l + (int) (Math.random() * (r - l + 1)), r); //隨機選取切分值,然后交換到數組最后一位int []p=partition(arr,l,r);//返回于切分值相等的左右界quickSort(arr,l,p[0]-1);quickSort(arr,p[1]+1,r);}}public static int[]partition(int[]arr,int l,int r){int less=l-1; //小于區域的右邊界int more=r; //大于區域的左邊界,初始包含最右端元素,即切分值。while(l<more){if(arr[l]<arr[r]){ //arr[r]作為切分值swap(arr,++less,l++); //如果當前元素小于切分值,那么將當前元素和小于區域的右邊第一個元素和當前元素交換,小于區域向右擴大一位,訪問下一個元素,繼續進行比較。}else if(arr[l]>arr[r]){swap(arr,--more,l);//如果當前元素大于切分值,那么將當前元素和大于區域的左邊第一個元素和當前元素交換,大于區域向左擴大一位,繼續訪問當前元素,進行比較。}else{ //和切分值相等l++;}}swap(arr,more,r); //將切分值換到中間return new int[]{less+1,more}; //與切分值相等的區間}public static void swap(int[]arr,int more,int r){arr[more]=arr[more]^arr[r];arr[r]=arr[more]^arr[r];arr[more]=arr[more]^arr[r];} }??快速排序是原地排序,不需要輔助數組,但是遞歸調用需要輔助棧??焖倥判蜃詈玫那闆r下是每次都正好將數組對半分,這樣遞歸調用次數才是最小的。這種情況下比較次數為Cn=2Cn/2+n,復雜度為O(NlogN)。
??最壞的情況是,第一次從最大的元素或最小的元素切分,第二次從第二大或者第二小的元素切分,如此這般,最壞情況下的比較次數為N * N /2。為了防止數組一開始就是有序的,我們在選擇切分值是,進行隨機選取。
??切分函數partition的應用,荷蘭國旗問題,將數組分成三部分,分別對應于小于,等于,大于 切分元素。時間復雜度為O(n)。
public int[]partition(int []arr,int l,int r){int less=l-1; //小于區域的右邊界int more=r; //大于區域的左邊界,初始包含最右端元素,即切分值。while(l<more){if(arr[l]<arr[r]){ //arr[r]作為切分值swap(arr,++less,l++); //如果當前元素小于切分值,那么將當前元素和小于區域的右邊第一個元素和當前元素交換,小于區域向右擴大一位,訪問下一個元素,繼續進行比較。}else if(arr[l]>arr[r]){swap(arr,--more,l);//如果當前元素大于切分值,那么將當前元素和大于區域的左邊第一個元素和當前元素交換,大于區域向左擴大一位,繼續訪問當前元素,進行比較。}else{ //和切分值相等l++;}}swap(arr,more,r); //將切分值換到中間return new int[]{less+1,more}; //與切分值相等的區間 }轉載于:https://www.cnblogs.com/yjxyy/p/11103372.html
總結
以上是生活随笔為你收集整理的排序---快速排序及其切分函数Partition应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用vue和jQuery实现中国主要城市
- 下一篇: 监控j服务器jvm运行情况 - spri