Chinaunix首页 | 论坛 | 博客
  • 博客访问: 622452
  • 博文数量: 79
  • 博客积分: 848
  • 博客等级: 军士长
  • 技术积分: 1800
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-26 19:30
文章分类

全部博文(79)

文章存档

2015年(4)

2013年(39)

2012年(36)

分类: C/C++

2013-07-22 14:37:52

排序只有1、2、3三个元素的数组,不能统计1、2、3的个数

分析:
假如我们按照常规的排序算法来做的话,最快也要(nlgn)的时间复杂度,既然我们知道数组中仅仅存在1、2、3三个数字,很自然的想到我们可以把数组重新排列成三块,如何排列呢?
我们可以用三个指针,分别指向1的序列的末尾,2的序列的末尾,3的序列的开头位置,初始化p1 = p2 = 0,p3 = size -  1,依次扫描整个数组,假如碰到的是2,指针p2后移,如果遇到1,交换p1和p2所指向的元素,两个指针同时后移,如果遇到3,向右移动p3,直到p3指向一个不为3的元素,交换p2 和 p3,这样扫描一遍数组,即可完成排序。

代码如下:

点击(此处)折叠或打开

  1. /*************************************************************************
  2.     > File Name: 27.cpp
  3.     > Author: dongdaoxiang
  4.     > Func: sort array just have 1,2,3,can not statistic the number of them
  5.     > Mail: dongdaoxiang@ncic.ac.cn
  6.     > Created Time: 2013年07月22日 星期一 13时58分09秒
  7.  ************************************************************************/
  8. #include<iostream>
  9. using namespace std;

  10. void sort(int *arr, const int size)
  11. {
  12.     if(NULL == arr)
  13.         return;
  14.     int p1 = 0, p2 = 0, p3 = size - 1;
  15.     while(p2 < p3)
  16.     {
  17.         if(arr[p2] == 2)
  18.         {
  19.             p2++;
  20.         }
  21.         if(arr[p2] == 1)
  22.         {
  23.             swap(arr[p1], arr[p2]);
  24.             p1++;
  25.             p2++;
  26.         }
  27.         if(arr[p2] == 3)
  28.         {
  29.             while(p2 < p3 && arr[p3] == 3)
  30.             {
  31.                 p3--;
  32.             }
  33.             swap(arr[p2], arr[p3]);
  34.         }
  35.     }
  36. }

  37. int main()
  38. {
  39.     int arr[10] = {2, 1,2,3,1,1,2,3,2,3};
  40.     sort(arr, 10);
  41.     int i = 0;
  42.     for(i = 0; i < 10; i++)
  43.     {
  44.         cout << arr[i] << " ";
  45.     }
  46.     cout << endl;
  47.     return 0;
  48. }


阅读(1553) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~