Chinaunix首页 | 论坛 | 博客
  • 博客访问: 146979
  • 博文数量: 56
  • 博客积分: 245
  • 博客等级: 二等列兵
  • 技术积分: 520
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-08 14:43
个人简介

慢慢来

文章分类

全部博文(56)

文章存档

2017年(5)

2016年(2)

2015年(6)

2014年(28)

2013年(5)

2012年(10)

我的朋友

分类: C/C++

2014-08-04 00:22:09

**转载请注明**

接下来谈到了devide-and-conquer 方法。 (分而治之 。。。)

所以就来到了一个看起来最简单的排序。归并排序(Merge Sort):

原理:初始状态是两组已排序的数组,把他们归并到一起,方法就是每次取两个数组里最小的做比较,较小的push入结果集。

* 两摞已经排好序的牌,朝上放在桌上,每次取最小的放在手中,都取完就得到已经排好序的一摞牌了。



C++代码:

点击(此处)折叠或打开

  1. #include <iostream>

  2. using namespace std;

  3. //#define INT_MAX 2147483647

  4. void MERGE_SORT ( int*, int, int );
  5. void MERGE( int*, int, int, int );

  6. int main(){
  7.     int a[] = {5,2,4,6,1,3};

  8.     MERGE_SORT(a, 0, sizeof(a)/sizeof(int)-1); //这次函数不是取长度而是最末位置了。所以-1

  9.     for (int i = 0; i < sizeof(a)/sizeof(int); i++){
  10.         cout << a[i] << endl;
  11.     }
  12.     return 0;
  13. }

  14. void MERGE_SORT( int* array, int start, int end ){
  15.     int half_len = (end-start)/2;
  16.     if ( end > start ){
  17.         MERGE_SORT(array, start, start+half_len);
  18.         MERGE_SORT(array, start+half_len+1, end);
  19.     }

  20.     MERGE(array, start, start+half_len, end);
  21. }

  22. void MERGE( int* array, int start, int point, int end ){
  23.     int len1 = point - start + 1;
  24.     int len2 = end - point;
  25.     int tmp_arr1[len1+1];
  26.     int tmp_arr2[len2+1];

  27.     for ( int i = start; i <= point; i++ ){
  28.         tmp_arr1[i-start] = array[i];
  29.     }
  30.     tmp_arr1[len1] = INT_MAX;

  31.     for ( int i = point + 1; i <= end; i++ ){
  32.         tmp_arr2[i-point-1] = array[i];
  33.     }
  34.     tmp_arr2[len2] = INT_MAX;

  35.     for ( int i = start, j = 0, k = 0; i <= end; i++ ){
  36.         if (tmp_arr1[j] <= tmp_arr2[k]){
  37.             array[i] = tmp_arr1[j++];
  38.         }
  39.         else{
  40.             array[i] = tmp_arr2[k++];
  41.         }
  42.     }
  43. }




空间复杂度:
    O(n)

时间复杂度:
    O(n*lgn)
阅读(400) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~