Chinaunix首页 | 论坛 | 博客
  • 博客访问: 506463
  • 博文数量: 184
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1172
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-21 13:40
个人简介

技术改变命运

文章分类

全部博文(184)

文章存档

2020年(16)

2017年(12)

2016年(156)

我的朋友

分类: C/C++

2016-07-06 21:35:18

题目描述:
    现有n个红白蓝三种不同颜色的小球,,乱序排序在一起,请通过两两交换任意两个球,使得从左至右的球依次是红(1),白(1),蓝(2)。
基本思路:
    划分过程:一个前指针begin,一个中指针current,一个后指针end,current指针遍历整个数组序列
    (1)当current指针指向0时,与begin指针指向的内容交换,而后current++,begin++;
    (2)当current指针指向1时,不做任何交换,而后current++;
   (3)当current指针指向2时,与end指针指向的元素交换,而后end--;current不动
c代码如下:

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #define swap(t,x,y) (t = (x),x = (y),y = (t))//最近总写错swap宏定义
  5. void sort(int *a,int lo,int hi)
  6. {
  7.     int begin = lo;
  8.     int end = hi;
  9.     int current = lo;
  10.     int temp = 0;
  11.     while (current <= end)
  12.     {
  13.         if (a[current] == 0)
  14.         {
  15.             swap(temp,a[current],a[begin]);
  16.             current++;
  17.             begin++;
  18.         }
  19.         else if (a[current] == 1)
  20.         {
  21.             current++;
  22.         }    
  23.         else
  24.         {
  25.             swap(temp,a[current],a[end]);
  26.             end--;//这个忘写了 2016.8.20
  27.         }
  28.     }
  29. }
  30. int main()
  31. {
  32.     int len = 0;
  33.     printf("请输入数组长度:");
  34.     scanf("%d",&len);
  35.     int a[len];
  36.     memset(a,0,len);
  37.     int i = 0;
  38.     for (i = 0;i < len;i++)
  39.     {
  40.         printf("请输入第%d个元素",i+1);
  41.         scanf("%d",&a[i]);
  42.     }
  43.     sort(a,0,len-1);
  44.     for (i = 0;i < len;i++)
  45.     {
  46.         printf("%d ",a[i]);
  47.     }
  48.     printf("\n");
  49.     return 0;
  50. }
运行结果如下:(centos5.5)
[root@localhost ~]# ./a.out
请输入数组长度:3
请输入第1个元素1
请输入第2个元素0
请输入第3个元素2
0 1 2 

阅读(776) | 评论(0) | 转发(0) |
0

上一篇:投硬币问题

下一篇:完美洗牌算法(1)

给主人留下些什么吧!~~