劍指offer中題目:http://ac.jobdu.com/problem.php?pid=1516
- 題目描述:
-
輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有的奇數位於數組的前半部分,所有的偶數位於位於數組的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。
- 輸入:
-
每個輸入文件包含一組測試案例。
對於每個測試案例,第一行輸入一個n,代表該數組中數字的個數。
接下來的一行輸入n個整數。代表數組中的n個數。
- 輸出:
-
對應每個測試案例,
輸入一行n個數字,代表調整後的數組。注意,數字和數字之間用一個空格隔開,最後一個數字後面沒有空格。
- 樣例輸入:
-
5 1 2 3 4 5
- 樣例輸出:
-
1 3 5 2 4
如果用時間複雜度爲o(n^2),空間複雜低。
先看空間複雜度3n,時間複雜度爲n的代碼:
#include <stdio.h>
#define MAXSIZE 100000
int Array[MAXSIZE];
int EvenIndex[MAXSIZE];
int OddIndex[MAXSIZE];
int main()
{
int i;
int N;
int EvenCount;
int OddCount;
while (scanf("%d", &N) != EOF)
{
EvenCount = 0;
OddCount = 0;
for (i = 0; i < N; ++i)
{
scanf("%d", Array+i);
if (Array[i] % 2 == 0) EvenIndex[EvenCount++] = i;
else OddIndex[OddCount++] = i;
}
for (i = 0; i < OddCount-1; ++i)
{
printf("%d ", Array[OddIndex[i]]);
}
if (OddCount > 0)
{
printf("%d", Array[OddIndex[OddCount-1]]);
if (EvenCount > 0) printf(" ");
}
for (i = 0; i < EvenCount-1; ++i)
{
printf("%d ", Array[EvenIndex[i]]);
}
if (EvenCount > 0)
{
printf("%d\n", Array[EvenIndex[EvenCount-1]]);
}
}
return 0;
}
/**************************************************************
Problem: 1516
User:
Language: C
Result: Accepted
Time:70 ms
Memory:2084 kb
****************************************************************/
時間複雜度爲n^2的,超時:
#include <stdio.h>
#define MAXSIZE 100000
int Array[MAXSIZE];
void test4(int vArray[], int vLen)
{
int i;
int k;
int Temp;
for (i = 0; i < vLen; ++i)
{
if (vArray[i] % 2)
{
for (k = i-1; k >= 0; --k)
{
if (vArray[k] % 2) break;
if (vArray[k] % 2 == 0)
{
Temp = vArray[k+1];
vArray[k+1] = vArray[k];
vArray[k] = Temp;
}
}
}
}
for (i=0 ; i < vLen-1; ++i)
{
printf("%d ", vArray[i]);
}
printf("%d\n", vArray[vLen-1]);
}
int main()
{
int i;
int N;
while (scanf("%d", &N) != EOF)
{
for (i = 0; i < N; ++i)
{
scanf("%d", &Array[i]);
}
test4(Array, N);
}
return 0;
}
/**************************************************************
Problem: 1516
User:
Language: C
Result: Time Limit Exceed
****************************************************************/