簡體   English   中英

在數組中配對偶數和奇數

[英]Pairing even and odd numbers in an array

我正在為C考試學習,我的教授說我對練習的解決方案不夠有效。 如何提高效率?

練習:編寫一個程序,在其中初始化N個元素的數組(N是一個常數)。 在程序中,生成並打印一個新數組,其中第一個元素中的元素將根據奇偶校驗進行排序(第一個元素是偶數,然后是奇數,它們不必大小)。

我的解決方案是這樣的:

#include <stdio.h> 
#define N 10
int
main ()
{

int a[N] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int b[N];
int i, j, temp;
for (i = 0; i < N - 1; i++)
{
  for (j = i + 1; j < N; j++)
    {
        if (a[j] % 2 == 0)
            {
                temp = a[j];
                a[j] = a[i];
                a[i] = temp;
            }
    }
}

for (i = 0; i < N; i++)
{
  b[i] = a[i];
  printf ("%d,", b[i]);
}

}

您的算法為O(N ** 2),因為您有兩個嵌套循環,每個循環都重復O(N)次。

最有效的算法的復雜度為O(n)。 這是一個簡單的穩定分區算法:

int write_pos = 0;
/* copy only even: O(N) */
for (int i=0 ; i < N ; i++)
{
  if (a[i] % 2 == 0)
  {
     b[write_pos++] = a[i];
  }
}
/* copy only odd: O(N) */
similar to the above

總復雜度O(N)+ O(N)= O(N)。

我正在使用額外的內存(在問題中給出了),但是分區也可以就地完成。 如果可以接受不穩定分區,則在O(n)中進行分區。

如果目標是增加O(1)個內存和一個穩定的分區(保留元素的相對順序),則運行時復雜度將變為O(n log n)。 這種划分是在一半大小的數組上遞歸執行的。 然后,通過旋轉中間尺寸將一半尺寸的陣列合並。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM