快速排序(快排)
阿新 • • 發佈:2018-06-26
分數 處理 image [] oar length ref log quic
快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
算法處理過程(截圖參考 坐在馬桶上看算法:快速排序):
代碼:
public class QuickSort { public static void sort(int[] arr, int low, int high){ int l = low; int h = high;int tmp = 0; if (l <= h){//掃描低位標小於高位標 tmp = arr[l]; while (l != h){//從兩邊交替掃描,直到l=h while (h>l && arr[h]>tmp) h--; //從右往左掃描,找到第一個比基準數據小的數,進行替換 arr[l] = arr[h]; while (l<h && arr[l]<tmp) l++;//從左往右掃描,找到第一個比基準數據大的數,進行替換 arr[h] = arr[l]; } arr[h] = tmp; sort( arr, low, l-1 ); //對基準元素左邊的數據進行排序 sort( arr, h+1, high ); //對基準元素右邊的數據進行排序 } } public static void main(String[] args){ int[] arr = {10, 2, 1, 7, 12, 23, 32, 4, 6, 98}; sort( arr,0, arr.length-1 ); for (int i : arr){ System.out.println(i); } } }
時間復雜度:基準數據選擇為最大或者最小值時,時間復雜度為O(n^2),若選擇的基準數據為中間數時,時間復雜度為O(nlog2n)
空間復雜度:O(log2n)
穩定性:非穩定排序
快排應用
把一個0-1串(只包含0和1的串)進行排序,你可以交換任意兩個位置,問最少交換的次數?
采用快排,左邊的0和右邊的1都可以不用管,只計算需要交換的數據次數即可。
偽代碼:
000...10100..1111
int count = 0;
for(int i=0,j=len-1; i<j; ++i,--j){
for(; (i<j)&&(a[i]==0); ++i);
for(; (i<j)&&(a[j]==1); --j);
if(i<j) ++count;
}
快速排序(快排)