码迷,mamicode.com
首页 > 其他好文 > 详细

荷兰国旗问题

时间:2019-06-07 12:36:23      阅读:92      评论:0      收藏:0      [点我收藏+]

标签:temp   个数   name   col   const   span   lan   引用   ace   

题目描述:  

  给定一个数组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 }

 

  

荷兰国旗问题

标签:temp   个数   name   col   const   span   lan   引用   ace   

原文地址:https://www.cnblogs.com/zzw1024/p/10987751.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!