Java 程式將陣列中的 0 放到左側,1 放到右側


隔離是軟體工程領域中的一個過程,其中程式碼被強制依賴於那些未使用的的方法。隔離介面被稱為ISP。它將本質上龐大的介面拆分。在 Java 環境中,實現隔離原則有很多優勢。它提高了特定程式碼的可讀性。它還有助於方便地維護該特定程式碼。

問題陳述

有一個包含 7 和 16 的陣列,它們是無序的。我們必須將 7 分隔到左側,將 16 分隔到右側。這裡的基本目標是使用Java遍歷這些元素。

輸入

Input array = [7,16,7,16,7,16,7,16]

輸出

Output array = [7,7,7,7,16,16,16,16]   

不同的方法

以下是將陣列中 0 分隔到左側,1 分隔到右側的不同方法:

讓我們討論一下隔離過程的實現,以將陣列中的 0 放到左側,1 放到右側。

將陣列中的 0 分隔到左側,1 分隔到右側的步驟:

  • 開始。

  • 建立兩個不同的索引。

  • 將第一個索引宣告為 0。(左側)

  • 將第二個索引宣告為 n-1。(右側)

  • 遵循條件:left < right。

  • 遞增左側索引(其值為 0)

  • 遞減右側索引(其值為 1)

  • 如果 left < right,則交換位置。

  • 否則,繼續執行該過程。

演算法

int left = 0, right = size-1;
while (left < right){
   while (array[left] == 0 && left < right)
   left++;
   while (array[right] == 1 && left < right)
   right--;
   if (left < right){
      array[left] = 0;
      array[right] = 1;
      left++;
      right--;
   }  
}

在上面的演算法中,我們可以看到函式如何將陣列中所有 0 分隔到左側,1 分隔到右側。

  • 使用兩個指標;

    • 對於從開頭開始的元素 X(索引 = 0)

    • type1(對於元素 1)從末尾開始(索引 = array.length-1)。

    • 初始化 type0 = 0

    • type1 = array.length-1

  • 需要將 1 放到陣列的右側。完成此過程後,0 將肯定移到左側。

透過使用計數隔離方法

過程:以下是使用計數隔離方法的分步過程。

  • 計算 0 的數量。

  • 遍歷整個陣列。

  • 搜尋元素。

  • 維護資料並遞增它,直到結果出現。

  • 列印。

  • 剩餘的 1 的數量。

  • 列印剩餘的數量。

示例

import java.util.*;
import java.util.Arrays;

public class tutorialspoint {
   static void segregate7and16(int arr[], int n){
      int count = 0;
      for (int a = 0; a < n; a++) {
         if (arr[a] == 0)
            count++;
      }

      for (int a = 0; a < count; a++)
      	arr[a] = 0;

      for (int i = count; i < n; i++)
         arr[i] = 1;
      }

      static void print(int arr[], int n){
      System.out.print("Array after segregation list is here ");

      for (int i = 0; i < n; i++)
      	System.out.print(arr[i] + " ");
   }
   public static void main(String[] args){
      int arr[] = new int[] { 7, 16, 7, 16, 16, 16,7,16 };

      int n = arr.length;

      segregate7and16(arr, n);

      print(arr, n);
   }
}

輸出

Array after segregation list is here 1 1 1 1 1 1 1 1

在此特定程式碼中

時間複雜度:O(n)

輔助空間:O(1)

透過使用陣列上的排序方法

sort() 方法屬於java.util 包

語法

public static void sort(int[] arr, int from_Index, int to_Index)
  • 引數

    • arr - 要排序的陣列

    • from_Index - 要排序的包含索引。

    • to_Index - 要排序的排除索引。

示例

import java.util.*;

public class tutoriaspoint {
   static void print(int arr[], int n){
      System.out.print("Array after segregation is ");
      for (int i = 0; i < n; ++i)
         System.out.print(arr[i] + " ");
	}
	public static void main(String[] args){
       int arr[] = new int[] { 0, 1, 0, 1, 1, 1 };
       int n = arr.length;
       Arrays.sort(arr);
       print(arr, n);
   }
}

輸出

Array after segregation is 0 0 1 1 1 1 

在此特定程式碼中

時間複雜度:O(nlogn)

輔助空間:O(log n)

透過使用指標

需要維護左側指標並將其與左側的位置交換。當在陣列中找到零時,遞增左側指標。

示例

import java.util.*;
import java.io.*;

public class tutorialspoint {
   static void print(int a[]){
      System.out.print("Array after segregation is: ");
      for (int i = 0; i < a.length; ++i) {
         System.out.print(a[i] + " ");
      }
   }
   public static void main(String[] args){
      int a[] = { 1, 1, 0, 0, 0, 0, 1, 1 };
      int left = 0;
      for (int i = 0; i < a.length; ++i) {
         if (a[i] == 0) {
            int temp = a[left];
            a[left] = a[i];
            a[i] = temp;

            ++left;
         }
      }
      print(a);
   }
}

輸出

Array after segregation is: 0 0 0 0 1 1 1 1

在此特定程式碼中

時間複雜度:O(n)

輔助空間:O(1)

透過使用蠻力方法

維護左側指標並將其與左側的位置交換。當在陣列中找到零時,遞增左側指標。

該方法將首先計算數量。然後,它將相應地用 0 和 1 填充資料。

過程

  • 該過程將根據陣列大小計算數量。

  • 計算完成後,填充將開始。

示例

public class segregatearray {
	static void segregating0sand1s(int arr[], int n){
      int count = 0; //count no of zeros in array
      for (int i = 0; i < n; i++) {
      	if (arr[i] == 0)
            count++;
     }
 
     for (int i = 0; i < count; i++)
      	arr[i] = 0; // fill the array with 0 until termination
     for (int i = count; i < n; i++)
      	arr[i] = 1; // fill remaining array with 1 until termination
   }
   static void print(int arr[], int n){
      System.out.print("Array after the process 0s and 1s are ");
      for (int i = 0; i < n; i++)
         System.out.print(arr[i] + " ");
   }
   public static void main(String[] args){
      int arr[] = new int[]{ 1, 1, 0, 0, 1, 1 };
      int n = arr.length;
      segregating0sand1s(arr, n);
      print(arr, n);    
   }
}

輸出

Array after the process 0s and 1s are 0 0 1 1 1 1 

在此特定程式碼中

時間複雜度:O(n)

輔助空間:O(1)

結論

在本文中,我們學習瞭如何將所有 0 分隔到左側,將所有 1 分隔到右側,以及如何分隔 0 和 1 以及其不同的方法、虛擬碼、實現和程式碼。在這裡,我們定義了一個數組,並將該陣列及其總長度傳遞給函式。

更新於: 2024 年 8 月 6 日

1K+ 次檢視

開啟您的職業生涯

透過完成課程獲得認證

立即開始
廣告

© . All rights reserved.