Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1901799
  • 博文数量: 217
  • 博客积分: 4362
  • 博客等级: 上校
  • 技术积分: 4180
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-20 09:31
文章分类

全部博文(217)

文章存档

2017年(1)

2015年(2)

2014年(2)

2013年(6)

2012年(42)

2011年(119)

2010年(28)

2009年(17)

分类: C/C++

2011-08-25 17:28:35

    今天上午电话面试,面试官想测试一下我的算法怎么样,给我出了一个拆分数组奇偶数的题目(估计面试官是当时零时想的吧)。
题目描述:有一个整型数组,请把所有的奇数放在前部分,所有的偶数放在后半部分。
算法描述:面试之前,我刚看了快速排序的算法,脑子里一直留有这个映像,一听题目,我就把这个题目和快速排序结合在了一起,仔细一想,这个题目似乎比快速排序更简单些,快速排序的话,需要多趟,但是这个题目只需要一趟就可以完成了。模仿快速排序的算法,设置一个low和high下标,开始的时候low=0,high=N-1,然后从low位置从前往后开始,找到第一个不是奇数(也就是偶数)的的下标,再从high位置从后向前走,找到第一个不是偶数(也就是奇数)的下标,交换找到的这两个数据,循环这样的操作,直至low>=high为止。
程序实现:
  1. #include <stdio.h>

  2. #define N 10

  3. int main()
  4. {
  5.     int a[N] = {8, 7, 1, 9, 2, 5, 5, 19, 25, 98};
  6.     int i, tmp, index, low, high;

  7.     low = 0;
  8.     high = N-1;

  9.     for(i=0; i < N-1; i++) {
  10.         printf("%d ", a[i]);
  11.     }
  12.     printf("\n");

  13.     while(low < high) {
  14.         i = low;
  15.         while(a[i]%2 != 0) {
  16.             low++;
  17.             i = low;
  18.         }
  19.         index = i;
  20.         i = high;
  21.         while(a[i]%2 == 0) {
  22.             high--;
  23.             i = high;
  24.         }
  25.         /*如果不是这个的话,应该退出循环了*/
  26.         if(low < high) {
  27.             tmp = a[index];
  28.             a[index] = a[i];
  29.             a[i] = tmp;
  30.         }
  31.     }

  32.     for(i=0; i < N-1; i++) {
  33.         printf("%d ", a[i]);
  34.     }
  35.     printf("\n");
  36.     return 0;
  37. }
运行结果:
  1. 8 7 1 9 2 5 5 19 25
  2. 25 7 1 9 19 5 5 2 8


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