Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2877376
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: C/C++

2012-09-04 12:46:24

重排问题

给定含有n个元素的整型数组a,其中包括0元素和非0元素,对数组进行排序,要求:

1. 排序后所有0元素在前,所有非零元素在后,且非零元素排序前后相对位置不变

2. 不能使用额外存储空间,直接置为0,哪里要用额外的空间

例子如下

输入 0, 3, 0, 2, 1, 0, 0

输出 0, 0, 0, 0, 3, 2, 1

分析

此排序非传统意义上的排序,因为它要求排序前后非0元素的相对位置不变,或许叫做整理会更恰当一些。我们可以从后向前遍历整个数组,遇到某个位置i上的元素是非0元素时,如果a[k]为0,则将a[i]赋值给a[k],a[k]赋值为0。实际上i是非0元素的下标,而k是0元素的下标

应该先从最后开始向前找到第一个0,然后再用Arrange做处理。
 

点击(此处)折叠或打开

  1. #include
  2. #define N 15
  3. int B[N];
  4. //应该先从最后开始向前找到第一个0用k指向,然后再用Arrange做处理。
  5. void arrange(int a[],int n)
  6. {
  7.     int k=n-1;
  8.     for(int i=n-1;i>=0;i--)
  9.     {
  10.         if(a[i]!=0)//前导为0不用管,k不用移,前导不为0,就要看下k是否为0,要接着移
  11.         {
  12.             if(a[k]==0)
  13.             {
  14.                 a[k]=a[i];
  15.                 a[i]=0;//把[i]与a[k]交换0 5 6 0 1
  16.                 //k要继续指向另一个可能为0的数
  17.             }
  18.             k--;//a[k]不为0也要向前指,肯定能够指到为0;
  19.         }
  20.     }
  21.     
  22. }
  23. int main()
  24. {
  25.     int i;
  26.     for(i=0;i
  27.     {
  28.         scanf("%d",&B[i]);
  29.     }
  30.     arrange(B,N);
  31.     for(i=0;i
  32.     {
  33.         printf("%d ",B[i]);
  34.     }

  35.     printf("\n");

  36.     return 0;
  37. }

  38. /*
  39. 1 4 0 7 9 0 13 16 19 20 24 0 27 28 29
  40. 0 0 0 1 4 7 9 13 16 19 20 24 27 28 29
  41. Press any key to continue

  42. */







组合问题

给定一个含有n个元素的整型数组a,从中任取m个元素,求所有组合。比如下面的例子

a = 1, 2, 3, 4, 5

m = 3

输出

1 2 3, 1 2 4, 1 2 5, 1 3 4, 1 3 5, 1 4 5

2 3 4, 2 3 5, 2 4 5
3 4 5

分析

典型的排列组合问题,首选回溯法,为了简化问题,我们将a中n个元素值分别设置为1-n

代码









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