[英]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.