Chinaunix首页 | 论坛 | 博客
  • 博客访问: 65448
  • 博文数量: 115
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-08 19:09
文章分类
文章存档

2015年(115)

我的朋友

分类: C/C++

2015-08-06 16:43:15

原文地址:原地二路归并 作者:runningdark

原地二路归并排序。
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. }

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