題目:
在一個N個整數數組里面,有多個奇數和偶數,設計一個排序算法,令所有的奇數都在左邊。
請完成sort的代碼實現(C++或Java)
C++:
void sort(int N, int[]a)
{
…
}
例如: 當輸入a = {8,4,1,6,7,4,9,6,4},
a = {1,7,9,8,4,6,4,6,4}為一種滿足條件的排序結果
思路:
1、Partition過程,從數組左右兩邊往中間掃,找到左邊第一個偶數,找到右邊第一個奇數,然后左右交換,直至二者相遇。
2、遍歷數組,遇到奇數則將它依次放在左邊的位置,並與該位置的偶數交換,即第1個奇數放在第1個位置,第2個奇數放在第2個位置。。。具體實現參考代碼。
代碼:
#include <iostream> using namespace std; void swap(int &a,int &b){ int tmp; tmp=a; a=b; b=tmp; } void sort_1(int n,int a[]){ int left=0,right=n-1; while(left<right){ while((a[left]&1)==1 && (left<right)) left++; while((a[right]&1)==0 && (left<right)) right--; if(left<right){ swap(a[left],a[right]); left++; right--; } } } void sort_2(int n,int a[]){ int cnt=0; int tmp; for(int i=0;i<n;i++){ if(a[i]&1){ tmp=a[cnt]; a[cnt]=a[i]; a[i]=tmp; cnt++; } } } int main() { int a[]={3,4,2,5,9,8,7,6,0,1}; int n=sizeof(a)/sizeof(a[0]); sort_1(n,a); for(int i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl; int b[]={3,4,2,5,9,8,7,6,0,1}; sort_2(n,b); for(int i=0;i<n;i++) cout<<b[i]<<" "; cout<<endl; return 0; }
運行結果:
兩種方法的思路不一樣,因此結果也不一致。