荷蘭國旗問題

題目描述:  

  給定一個數組arr,和一個數num,請把小于num的數放在數組的左邊,等于num的數放在數組的中間,大于num的數放在數組的右邊。要求額外空間復雜度O(1),時間復雜度O(N)

 

解題思路:

  使用兩個指針:p1,p2

  p1 = -1;  //左指針,在p1左邊并含p1的所有數都<num

  p2 = N ; //右指針,p2=N在p2的右邊含p2的所有數都大于num

  然后比較arr與num的值,并與相應的p1,p2的位置交換

 

代碼實現:  

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 
 6 void swap(int& a, int &b)
 7 {
 8     int temp;
 9     temp = a;
10     a = b;
11     b = temp;
12 }
13 
14 //記住,單次遍歷n(n << N)次數組的時間復雜度 = n*O(N) == O(N)
15 template<class T>//目前我只想到了使用模板來實現引用數組,其他的引用方法都報錯了。
16 void Test(T& array , const int num)
17 {
18     int N, p1, p2;//兩個指針
19     p1 = -1;//左指針,在p1左邊并含p1的所有數都<num
20     p2 = N = sizeof(array) / sizeof(array[0]);//右指針,p2=N在p2的右邊含p2的所有數都大于num
21     for (int i = 0; i != p2; )
22     {
23         if (array[i] < num)
24             swap(array[++p1], array[i++]);
25         else if (array[i] > num)
26             swap(array[--p2], array[i]);
27         else
28             ++i;
29 
30     }
31 
32 }
33 
34 void Heland()
35 {
36     int arr[] = { 1, 5,7,4,6,4,2,9 };    
37     Test(arr, 4);
38     for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i)
39         cout << arr[i] << "  ";
40     cout << endl << "**************************" << endl;
41 }

 

  

posted @ 2019-06-07 10:36 一筆一畫一人生 閱讀(...) 評論(...) 編輯 收藏