1. 程式人生 > 其它 >【演算法-Java實現】將陣列按某值劃分成左邊小,中間相等,右邊大的形式

【演算法-Java實現】將陣列按某值劃分成左邊小,中間相等,右邊大的形式

技術標籤:演算法演算法指標資料結構leetcodejava

【演算法-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; } }