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+ 次查看

开启您的职业生涯

通过完成课程获得认证

立即开始
广告