給定乙個陣列arr,和乙個整數num。請把小於等於num的數放在陣列的左邊,大於num的數放在陣列的右邊。
要求額外空間複雜度o(1),時間複雜度o(n)
給定乙個陣列arr,和乙個整數num。請把小於num的數放在陣列的左邊,等於num的數放在中間,大於num的數放在陣列的右邊。
要求額外空間複雜度o(1),時間複雜度o(n)
在原陣列左邊設定乙個邊界(left - 1),當index指向的數值比給定的值num小或等於時,將這個數與邊界右邊的數交換,然後邊界右移,
當index指向的數值比num大時,index右移動,邊界
在原陣列左邊設定乙個左邊界(left - 1),右邊設定乙個右邊界(right+1),當index指向的數值比給定的值num小時,將這個數與左邊界右邊的第乙個數交換,然後左邊界右移,index左移,當index指向的數值比num大時,將這個數與右邊界左邊的第乙個數交換,然後i右邊界左移,index不動,當index指向的數值與num相等時,邊界均不動,index左移.
用arr[r]對該範圍做partition,小於等於 arr[r]的數在左部分並且保證arr[r]最後來到左部分的最後乙個位置,記為m; 大於 arr[r]的數在右部分(arr[m+1..r])2)對arr[l..m-1]進行快速排序(遞迴)
3)對arr[m+1..r]進行快速排序(遞迴)
因為每一次partition都會搞定乙個數的位置且不會再變動,所以排序能完成.
在arr[l..r]範圍上,進行快速排序的過程:1)用arr[r]對該範圍做netherlandsflag,小於 arr[r]的數在左部分,等於arr[r]的數中間大於arr[r]的數在右部分。假設等於arr[r]的數所在範圍是[a,b]
2)對arr[l..a-1]進行快速排序(遞迴)
3)對arr[b+1..r]進行快速排序(遞迴)
因為每一次partition都會搞定一批數的位置且不會再變動,所以排序能完成
在arr[l..r]範圍上,進行快速排序的過程:1)在這個範圍上,隨機選乙個數記為num,
1)用num對該範圍做netherlandsflag,小於num的數在左部分,等於num的數中間,大於num的數在右部分。假設== num的數所在範圍是[a,b]
2)對arr[l..a-1]進行快速排序(遞迴)
3)對arr[b+1..r]進行快速排序(遞迴)
因為每一次partition都會搞定一批數的位置且不會再變動,所以排序能完成
//partition
public static int quicksortpartition(int arr,int left,int right)
if (left > right)
if (left == right)
int lessequal = left - 1;
int index = left;
while(index < right)
index++;
}swap(arr,right,++lessequal);
return lessequal;
}
public static int netherlandsflag(int arr,int left,int right);
}if (left == right);
}int value = arr[right];
int lessequal = left - 1;
int moreequal = right + 1;
int index = left;
while(index < moreequal)
if (arr[index] > value)
index++;
}return new int ;
}
public static void quicksort01(int arr)
process01(arr,0,arr.length-1);
}public static void process01(int arr, int left ,int right)
int mid = quicksortpartition(arr,left,right);
process01(arr,left,mid-1);
process01(arr,mid+1,right);
}// 主要是會有兩個邊界,沒有浪費每次對比的資訊
public static void quicksort02(int arr)
process02(arr, 0 ,arr.length-1);
}public static void process02(int arr, int left ,int right)
int bound = netherlandsflag(arr, left, right);
process02(arr,left,bound[0]);
process02(arr,bound[1],right);
}public static void quicksort3(int arr)
process3(arr, 0, arr.length - 1);
} public static void process3(int arr, int l, int r)
swap(arr, l + (int) (math.random() * (r - l + 1)), r);
int equalarea = netherlandsflag(arr, l, r);
process1(arr, l, equalarea[0] - 1);
process1(arr, equalarea[1] + 1, r);
}
荷蘭國旗問題 快速排序
目錄 一.荷蘭國旗 二.快速排序 亂序快排優化版 三.應用傳統快排求中位數 1.題目描述 給定乙個陣列arr和乙個數num,請把小於num的數放在陣列的左邊,等於num的數放在陣列的中間,大於num的數放在陣列的右邊。要求額外空間複雜度為o 1 時間複雜度為o n 2.分析思路 初始化less 1,...
荷蘭國旗問題,快速排序,隨機快速排序
荷蘭國旗問題 給定乙個陣列arr,和乙個數num,請把小於num的數放在陣列的 左邊,等於num的數放在陣列的中間,大於num的數放在陣列的 右邊。要求額外空間複雜度o 1 時間複雜度o n public static int partition int arr,int l,int r,int nu...
快速排序的應用 荷蘭國旗問題
題目描述 荷蘭國旗有三橫條塊構成,自上到下的三條塊顏色依次為紅 白 藍。現有若干由紅 白 藍三種顏色的條塊序列,要將它們重新排列使所有相同顏色的條塊在一起。本問題要求將所有紅色的條塊放最左邊 所有白色的條塊放中間 所有藍色的條塊放最右邊。題目中可以使用數字和顏色進行對應 red 0 white 1 ...