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

Now in Baidu WISE team

文章分类

全部博文(150)

文章存档

2014年(8)

2013年(31)

2012年(111)

分类: C/C++

2013-01-06 17:37:52

原地二路归并排序。
codepad.org已验证。
Reference:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define SWAP(a,b) (a)^=b;(b)^=a;(a)^=b;
  4. void output(int*input, int size){
  5.         int i = 0;
  6.     for(;i<size;i++){
  7.         printf("%d->",input[i]);
  8.     }
  9.     printf("\n");
  10. }
  11. void rev(int *input, int start, int end){
  12.     if(input == NULL || start>=end) return;
  13.     while(start<end){
  14.         SWAP(input[start],input[end]);
  15.         start++;
  16.         end--;
  17.     }
  18. }
  19. void rotate(int *input, int start, int end, int piv){
  20.     if(input == NULL || start>=end || piv>end || piv<start) return;
  21.     rev(input, start, end);
  22.     rev(input,start,start+end-piv);
  23.     rev(input,start+end-piv+1, end);
  24. }

  25. void merge(int *input, int start, int end, int mid){
  26.     if(input == NULL || start >= end) return;
  27.     int left = start;
  28.     int right = mid+1;
  29.     while(left<=end && right<=end){
  30.         if(input[left]>input[right]){
  31.             rotate(input, left,right,right);
  32.             left++;
  33.             right++;
  34.         }
  35.         else
  36.             left++;
  37.     }
  38.     
  39. }

  40. void mergesort(int *input, int start, int end){
  41.     if(input == NULL || end<=start) return;
  42.     int mid = (start+end)>>1;

  43.     mergesort(input, start, mid);
  44.     mergesort(input, mid+1, end);

  45.     merge(input, start, end, mid);
  46. }

  47. int main(){
  48.     int input[] = {1,3,5,7,8,4,3,2};
  49.     mergesort(input, 0, sizeof(input)/sizeof(int)-1);
  50.     int i = 0;
  51.     output(input, 8);
  52.     
  53. }

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