將數組中負數放在正數前面


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

View Code
 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).

View Code
 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 }

方法三:與方法二相類似,不過此方法不會改變數組中元素的相對順序。

View Code
 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)。

View Code
 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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM