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 以及其不同的方法、伪代码、实现和代码。在这里,我们定义了一个数组,并将该数组及其总长度传递给函数。