【演算法-Java實現】將陣列按某值劃分成左邊小,中間相等,右邊大的形式
阿新 • • 發佈:2020-12-09
【演算法-Java實現】將陣列按某值劃分成左邊小,中間相等,右邊大的形式
一.問題描述:
1.輸入:一個無序整型陣列arr,其中arr中元素不唯一。
如:int[] arr = { 3, 4, 6, 9, 5, 5, 8, 8, 2, 1, 7, 7, 0 };
2.輸出:將陣列arr按某值劃分成左邊小,中間相等,右邊大的形式,並輸出。
二.問題解答:
此問題的另外一種問法:荷蘭國旗問題
有一個數組,只有紅球,藍球,黃球,請將紅球放在陣列左邊,藍球放在陣列中間,黃球放在陣列右邊。
思路:
1.首先用一個基準num作為中間值,cur指標從下標0依次遍歷陣列至下標arr.length-1。
2.less指標一開始指向-1,more指標指向arr.length。
3.cur指標依次移動,判斷當前cur下標元素和num值之間的大小關係,進行元素交換。
具體實現見程式碼,結果如下:
三.演算法分析:
1.時間複雜度為O(N),相當於遍歷陣列。
2.額外空間複雜度為O(1),無需使用額外空間。
程式碼如下
import java.util.Arrays;
/*
* 問題:將陣列按某值劃分成左邊小,中間相等,右邊大的形式
*
*/
public class ArraySort {
//測試
public static void main(String[] args) {
int [] arr = { 3, 4, 6, 9, 5, 5, 8, 8, 2, 1, 7, 7, 0 };
int[] newArr = partition(arr, 0, arr.length - 1, 5);
System.out.println(Arrays.toString(newArr));
}
//演算法實現
public static int[] partition(int[] arr, int L, int R, int num) {
int less = -1;
int more = R + 1;
int cur = L;
while (cur < more) {
if (arr[cur] > num) {
swap(arr, --more, cur);
} else if (arr[cur] < num) {
swap(arr, ++less, cur++);
} else {
cur++;
}
}
return arr;
}
//元素交換
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}