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 以及其不同的方法、虛擬碼、實現和程式碼。在這裡,我們定義了一個數組,並將該陣列及其總長度傳遞給函式。
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP