方法一:從頭掃描這個數組,每碰到一個正數時,拿出這個數字,並把位於這個數字后面的所有數字往前挪動一位。挪完 之后在數組的末尾有一個空位,這時把該正數放入這個空位。由於碰到一個正,需要移動O(n)個數字,因此總的時間復雜度是O(n2),空間復雜度為O(1)。

1 #include <iostream.h> 2 void fun1(int a[],int n) 3 { 4 if (n<1) 5 { 6 cout<<"input error!"<<endl; 7 return; 8 } 9 int num=0; 10 for (int k=0;k<n;k++) 11 { 12 if (a[k]<0) 13 { 14 num++; 15 } 16 } 17 18 int temp; 19 for (int i=0;i<n;i++) 20 { 21 if (i<num) 22 { 23 while(a[i]>0) 24 { 25 temp=a[i]; 26 for(int j=i+1;j<n;j++) 27 { 28 a[j-1]=a[j]; 29 } 30 a[n-1]=temp; 31 } 32 } 33 else 34 { 35 break; 36 } 37 } 38 39 } 40 41 void main() 42 { 43 int data[6]={9,1,15,7,-5,-12}; 44 fun1(data,6); 45 for (int i=0;i<6;i++) 46 { 47 cout<<data[i]<<" "; 48 } 49 }
方法二:既然題目要求的是把負數放在數組的前半部分,正數放在數組的后半部分,因此所有的負數應該位於正數的前面。也就是說我們在掃描這個數組的時候,如果發現有正數出現在負數的前面,我們可以交換他們的順序,交換之后就符合要求了。因此我們可以維護兩個指針,第一個指針初始化為數組的第一個數字,它只向后移動;第二個指針初始化為數組的最后一個數字,它只向前移動。在兩個指針相遇之 前,第一個指針總是位於第二個指針的前面。如果第一個指針指向的數字是正而第二個指針指向的數字是負數,我們就交換這兩個數字。時間復雜度為O(n),空間復雜度為O(1).

1 #include <iostream.h> 2 #include <algorithm> 3 using namespace std; 4 void fun2(int a[],int n) 5 { 6 if (n<=1) 7 { 8 return; 9 } 10 int low=0,high=n-1; 11 while(low<high) 12 { 13 while(a[low]<0 && low<high) 14 { 15 low++; 16 } 17 while(a[high]>0 && low<high) 18 { 19 high--; 20 } 21 swap(a[low],a[high]); 22 } 23 24 } 25 26 void main() 27 { 28 int data[6]={-1,1,15,-3,-5,-12}; 29 fun2(data,6); 30 for (int i=0;i<6;i++) 31 { 32 cout<<data[i]<<" "; 33 } 34 }
方法三:與方法二相類似,不過此方法不會改變數組中元素的相對順序。

1 #include <iostream.h> 2 #include <algorithm> 3 using namespace std; 4 5 void fun3(int *a,int n) 6 { 7 if (NULL==a || n<=1) 8 { 9 return; 10 } 11 int *p=a; 12 int *q=a; 13 int *pos=q; 14 while(p<a+n) 15 { 16 if (*p<0) 17 { 18 swap(*p,*q); 19 pos=q; 20 while(pos<p) 21 { 22 ++pos; 23 swap(*pos,*p); 24 } 25 q++; 26 } 27 p++; 28 } 29 } 30 31 void main() 32 { 33 int data[6]={-1,1,15,-3,-5,-12}; 34 fun3(data,6); 35 for (int i=0;i<6;i++) 36 { 37 cout<<data[i]<<" "; 38 } 39 }
方法四:分配一段與原數組相同大小的內存,從左至右遍歷一遍原數組,將負數放在分配內存中前部分,並記錄負數的個數;然后再一次從左至右遍歷一遍數組,找出正數,將正數放在已放好的負數后面,此時負數已經在前面,而正數在后面,並且它們之間的相對順序也未改變。時間復雜度為O(n),但是空間復雜度為O(n)。

1 #include <iostream.h> 2 #include <string.h> 3 4 void fun4(int *a,int n) 5 { 6 if (NULL==a || n<=1) 7 { 8 return; 9 } 10 int num1=0,num2=0; 11 int *temp=new int[n]; 12 for (int i=0;i<n;i++) 13 { 14 if (a[i]<0) 15 { 16 temp[num1]=a[i]; 17 num1++; 18 } 19 } 20 num2=n-num1; 21 if (num2<=0) 22 { 23 return; 24 } 25 num2=0; 26 for (i=0;i<n;i++) 27 { 28 if (a[i]>0) 29 { 30 temp[num1+num2]=a[i]; 31 num2++; 32 } 33 } 34 memcpy(a,temp,sizeof(int)*n); 35 delete []temp; 36 } 37 38 39 void main() 40 { 41 int data[6]={1,1,15,3,5,12}; 42 fun4(data,6); 43 for (int i=0;i<6;i++) 44 { 45 cout<<data[i]<<" "; 46 } 47 }