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

技术改变命运

文章分类

全部博文(184)

文章存档

2020年(16)

2017年(12)

2016年(156)

我的朋友

分类: C/C++

2016-08-23 10:07:42


点击(此处)折叠或打开

  1. #include<iostream>
  2. using namespace std;
  3. int *aux = NULL;
  4. void sort(int *a,int,int);
  5. void merge(int *a,int lo,int mid,int hi)//归并有序子数组
  6. {
  7.     int i =lo,j = mid+1;
  8.     for (int k = lo;k <= hi;k++)
  9.     {
  10.         aux[k] = a[k];
  11.     }
  12.     for (int k = lo;k <= hi;k++)
  13.     {
  14.         if (i > mid) a[k] = aux[j++];
  15.         else if (j > hi) a[k] = aux[i++];
  16.         else if (aux[j]<aux[i]) a[k] = aux[j++];
  17.         else    a[k] = aux[i++];
  18.     }
  19. }
  20. void sort(int *a,int n)
  21. {
  22.     aux = new int[n];
  23.     sort(a,0,n-1);
  24.     delete[] aux;
  25. }
  26. //将两个子数组排序,通过归并两个字数组来将这个数组排序
  27. void sort(int *a,int lo,int hi)
  28. {
  29.     if (hi <= lo) return;
  30.     int mid = lo + (hi-lo)/2;
  31.     sort(a,lo,mid);
  32.     sort(a,mid+1,hi);
  33.     merge(a,lo,mid,hi);
  34. }
  35. int main()
  36. {
  37.     int a[] = {1,2,4,3,5};
  38.     sort(a,5);
  39.     for (int i = 0;i < 5;i++)
  40.     {
  41.         cout << a[i]<< " ";
  42.     }
  43.     cout << endl;
  44.     return 0;
  45. }
首先是两两归并,然后是四四归并,然后是八八归并,一直下去!(自低向下)

点击(此处)折叠或打开

  1. #include<iostream>
  2. using namespace std;
  3. int *aux = NULL;
  4. void Merge(int *a,int lo,int mid,int hi)
  5. {
  6.     int i = lo,j = mid+1;
  7.     for (int k = lo;k <= hi;k++)
  8.     {
  9.         aux[k] = a[k];
  10.     }
  11.     for (int k = lo;k <= hi;k++)
  12.     {
  13.         if (i > mid) a[k] = aux[j++];
  14.         else if (j > hi) a[k] = aux[i++];
  15.         else if (aux[i]<aux[j]) a[k] = aux[i++];
  16.         else    a[k] = aux[j++];
  17.     }
  18. }
  19. void sort(int *a,int n)
  20. {
  21.     int N = n;
  22.     aux = new int[N];
  23.     for (int sz = 1;sz < N;sz = sz+sz)
  24.     {
  25.         for (int lo = 0;lo<N-sz;lo += sz+sz)
  26.             Merge(a,lo,lo+sz-1,min(lo+sz+sz-1,N-1));
  27.     }
  28. }
  29. int main()
  30. {
  31.     int a[] = {5,4,3,2,1};
  32.     sort(a,5);
  33.     for (int i = 0;i < 5;i++)
  34.     {
  35.         cout << a[i]<<" ";
  36.     }
  37.     cout << endl;
  38.     return 0;
  39. }


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