📌  相关文章
📜  用于对 0、1 和 2 的数组进行排序的 C 程序

📅  最后修改于: 2022-05-13 01:56:08.408000             🧑  作者: Mango

用于对 0、1 和 2 的数组进行排序的 C 程序

给定一个由 0、1 和 2 组成的数组A[] 。任务是编写一个对给定数组进行排序的函数。这些函数应该把所有的 0 放在最前面,然后把所有的 1 和所有的 2 放在最后。
例子:

Input: {0, 1, 2, 0, 1, 2}
Output: {0, 0, 1, 1, 2, 2}

Input: {0, 1, 1, 0, 1, 2, 1, 2, 0, 0, 0, 1}
Output: {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2}

在这篇文章中讨论了一个简单的解决方案(对 0、1 和 2 的数组进行排序(简单计数))。
方法:

方法:这个问题类似于我们的旧帖子 Segregate 0s and 1s in an array,这两个问题都是著名的荷兰国旗问题的变体。
问题是用三种颜色提出的,这里是“0”、“1”和“2”。该数组分为四个部分:

  1. a[1..Lo-1] 零(红色)
  2. a[Lo..Mid-1] 个(白色)
  3. a[Mid..Hi] 未知
  4. a[Hi+1..N] 双(蓝色)
  5. 如果第 i 个元素为 0,则将元素交换到低范围,从而缩小未知范围。
  6. 同样,如果元素为 1,则保持原样,但缩小未知范围。
  7. 如果元素为 2,则将其与高范围内的元素交换。

    算法:

    1. 保持三个索引low = 1,mid = 1 和high = N,并且有四个范围,1到low(包含0的范围),low to mid(包含1的范围),mid to high(包含未知元素的范围)和高到 N(包含 2 的范围)。
    2. 从头到尾遍历数组,中间小于高。 (循环计数器为 i)
    3. 如果元素为 0,则将元素与索引低的元素交换并更新 low = low + 1 和 mid = mid + 1
    4. 如果元素为 1,则更新 mid = mid + 1
    5. 如果元素为 2,则将元素与索引高的元素交换,并更新 high = high – 1 并更新 i = i – 1。因为交换的元素未被处理
    6. 打印输出数组。

      空跑:
      在这个过程的一部分,一些红色、白色和蓝色元素是已知的,并且在“正确”的位置。未知元素部分 a[Mid..Hi] 通过检查 a[Mid] 被缩小:

      执行:

      C
      // C program to sort an array with 
      // 0, 1 and 2 in a single pass
      #include 
        
      // Function to swap *a and *b 
      void swap(int* a, int* b);
        
      // Sort the input array, the array is 
      // assumed to have values in {0, 1, 2}
      void sort012(int a[], int arr_size)
      {
          int lo = 0;
          int hi = arr_size - 1;
          int mid = 0;
        
          while (mid <= hi) 
          {
              switch (a[mid]) 
              {
                  case 0:
                  swap(&a[lo++], &a[mid++]);
                  break;
                  case 1:
                  mid++;
                  break;
                  case 2:
                  swap(&a[mid], &a[hi--]);
                  break;
              }
          }
      }
        
      // UTILITY FUNCTIONS 
      void swap(int* a, int* b)
      {
          int temp = *a;
          *a = *b;
          *b = temp;
      }
        
      /* Utility function to print 
         array arr[] */
      void printArray(int arr[],  
                      int arr_size)
      {
          int i;
          for (i = 0; i < arr_size; i++)
              printf("%d ", arr[i]);
          printf("n");
      }
        
      // Driver code
      int main()
      {
          int arr[] = {0, 1, 1, 0, 1, 2, 
                       1, 2, 0, 0, 0, 1};
          int arr_size = sizeof(arr) / sizeof(arr[0]);
          int i;
        
          sort012(arr, arr_size);
          printf("array after segregation ");
          printArray(arr, arr_size);
          getchar();
          return 0;
      }


      输出:

      array after segregation
       0 0 0 0 0 1 1 1 1 1 2 2 

      复杂性分析:

      • 时间复杂度: O(n)。
        只需要遍历一次数组。
      • 空间复杂度: O(1)。
        不需要额外的空间。

        有关详细信息,请参阅有关对 0、1 和 2 的数组进行排序的完整文章!