快速排序與荷蘭國旗及Partition問題

2022-01-09 21:11:20 字數 3102 閱讀 2405

給定乙個陣列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 ...