調整數組的中的元素使奇數位於數組的前面,偶數位於數組的後面

調整數組的中的元素使奇數位於數組的前面,偶數位於數組的後面

分爲兩部分的問題,最好只用兩個指針。

譬如此題:就可以一個指針從頭往後掃,而另一個指針從後往前掃,保證第一個指針永遠指向奇數,最後一個指針永遠指向偶數,然後兩者交換,直至最終兩個指針相等,即掃描完了所有的元素。

代碼如下所示:

 1 //調整數組順序使奇數位於偶數前面
 2 #include<iostream>
 3 using namespace std;
 4 void function1(int* number, unsigned int length)
 5 {
 6     int p1 = 0;
 7     int p2 = length - 1;
 8     while (p1<p2)
 9     {
10         while (p1 < p2 && (number[p1] & 0x1) != 0)//p1指向的不是偶數,p1++
11             ++p1;
12         while (p1 < p2 && (number[p2] & 0x1) != 1)//p2指向的不是奇數,P2--;
13             --p2;
14         if (p1 < p2)//交換兩個的值,注意:交換後的下一輪必然兩個指針都會向中間靠攏
15         {
16             int temp = number[p1];
17             number[p1] = number[p2];
18             number[p2] = temp;
19         }
20     }
21 }
22 void print16(int* number, unsigned int length)//打印函數
23 {
24     for (int i = 0; i < length; ++i)
25         cout << number[i] << "    ";
26     cout << endl;
27 }
28 int main16()
29 {
30     int A[7] = { 1, 2, 3, 4, 5, 6, 7 };
31     function1(A, 7);
32     print16(A, 7);
33     system("pause");
34     return 0;
35 }

代碼的魯棒性:

 1 #include<iostream>
 2 using namespace std;
 3 void print16(int* number, unsigned int length)
 4 {
 5     for (int i = 0; i < length; ++i)
 6         cout << number[i] << "    ";
 7     cout << endl;
 8 }
 9 //代碼的可重用性
10 void Reorder(int *pData, unsigned int length, bool(*func)(int))
11 {
12     int *pbegin = pData;
13     int *pend = pData + length - 1;
14     while (pbegin < pend)
15     {
16         while (pbegin < pend&&!func(*pbegin))
17             ++pbegin;
18         while (pbegin < pend&&func(*pend))
19             --pend;
20         if (pbegin < pend){
21             int temp = *pbegin;
22             *pbegin = *pend;
23             *pend = temp;
24         }
25     }
26 }
27 bool isEven(int n)
28 {
29     return (n & 1) == 0;
30 }
31 void ReorderOddEven(int *pData, unsigned int length)
32 {
33     Reorder(pData, length, isEven);
34 }
35 int main16()
36 {
37     int A[7] = { 1, 2, 3, 4, 5, 6, 7 };
38     //function1(A, 7);
39     //print16(A, 7);
40     ReorderOddEven(A, 7);
41     print16(A, 7);
42     system("pause");
43     return 0;
44 }

 

posted @ 2016-04-25 00:07 General_up 閱讀(...) 評論(...) 編輯 收藏
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章