Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1003471
  • 博文数量: 150
  • 博客积分: 3017
  • 博客等级: 少校
  • 技术积分: 3829
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-19 14:40
个人简介

Now in Baidu WISE team

文章分类

全部博文(150)

文章存档

2014年(8)

2013年(31)

2012年(111)

分类: C/C++

2013-03-08 17:44:07

长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap 请设计并实现排序。
google笔试小题。题目来源:休闲小题。
2个key
一个是只能与0 swap,另一个是数组的下标和值是一一对应的。
第二个容易被忽略。所以读到一个元素时,如果值和下标不等,那么可以直接把这个元素的值放到正确位置上去,目标位置的值挪回来。当然这个过程要借助元素0来完成。

假设输入是 2,0,3,1
step 1
遍历数组,找出值为0的元素,和num[0]交换
0 2 3 1

step 2
如果num[1]下标和值匹配,考虑下一个,否则
尝试把num[1]的值借助num[0]放入正确的位置
3 2 0 1 --》  3 0 2 1 --》 0 3 2 1

step 3
重复 step 2,直到 num[1]正确被放置了 1

step 4
num[1]处理完,step2处理下一个元素num[2],直到所有元素的位置和值都匹配



  1. void swap(int* num, int a, int b){
  2.     if(a == b) return;
  3.     int tmp = num[a];
  4.     num[a] = num[b];
  5.     num[b] = tmp;    
  6. }

  7. void sort(int* num, int size){
  8.     int i = 0;
  9.     //move 0 to num[0]
  10.     for(;i<size;i++){
  11.         if(num[i] == 0){
  12.             swap(num, i, 0);
  13.            }
  14.         }
  15.         i = 1;
  16.         while(i<size){
  17.         //postion matched value
  18.           if(num[i] == i){
  19.              i++;
  20.         }
  21.         //postion mismatch value, then need to place value to the correct postition and continue
  22.         else{
  23.             int tarpos = num[i];
  24.             swap(num, 0, tarpos); // num[tarpos] = 0
  25.             swap(num, tarpos,i); // num[i] = 0
  26.             swap(num, 0, i); // num[0] = 0
  27.         }
  28.     }
  29. }

  30. int main(){
  31.     int input[] = {2,0,3,1};
  32.     sort(input, 4);
  33.     int t = 0;
  34.     for(;t<4;t++)
  35.         printf("%d->",input[t]);
  36.     printf("n");
  37. }



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