码迷,mamicode.com
首页 > 其他好文 > 详细

hdu--3743--归并排序<自顶向下&&自底向上>2种写法

时间:2014-08-27 20:27:18      阅读:346      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   for   ar   art   

有些人说 归并排序的递归版本实用性差 可读性强  

非递归版本恰好相反

我觉得 也没那么明显差距吧.... 

其实非递归版本也不难理解的

假如 我们需要进行排序的数组的长度为 len 每次的子排序数组区间为size

那么我们首先将它拆成  len个size为1的小区间 然后2个相邻的进行合并merge排序 这时候 你需要判断一下 能否恰好一一合并 因为是奇数就不行了

这样 我们进行了第一趟归并 然后size*2 然后将size为2的2个相邻区间进行合并 继续判断..

一直到size>len 结束循环

...

传送----这篇写的不错

然后这题 我分别拿 递归的归并     非递归的归并进行了测试 没什么区别

其中 对于归并中的辅助数组我们可以选择直接开好足够大的静态数组 或者选择 new[right-left+1]来开  当然 我们也知道new的话会比较耗时 但同时也节省了内存

************************

差点忘记说这题了 毫无特色=-= 或许是因为我做了上一题的原因 只要你能读懂英文...#24 就是完全一样的啊...

bubuko.com,布布扣
 1 #include <iostream>
 2 using namespace std;
 3 
 4 typedef long long LL;
 5 LL sum;
 6 const int size = 1000010;
 7 int arr[size];
 8 int temp[size];
 9 
10 void merge_sort( int l , int r )
11 {
12     int p , q , mid , i;
13     if( r-l > 1 )
14     {
15         p = l;
16         mid = l + (r-l)/2;
17         q = mid;
18         i = l;
19         merge_sort( l , mid );
20         merge_sort( mid , r );
21         while( p<mid || q<r )
22         {
23             if( q>=r || ( p<mid && arr[p]<=arr[q]) )
24             {
25                 temp[i++] = arr[p++];
26             }
27             else
28             {
29                 temp[i++] = arr[q++];
30                 sum += mid-p;
31             }
32         }
33         for( i = l ; i < r ; i++ )
34             arr[i] = temp[i];
35     }
36 }
37 
38 int main()
39 {
40     cin.sync_with_stdio(false);
41     int n;
42     while( cin >> n )
43     {
44         sum = 0;
45         for( int i = 0 ; i<n ; i++ )
46             cin >> arr[i];
47         merge_sort( 0 , n );
48         cout << sum << endl;
49     }
50     return 0;
51 }
View Code

 

 

bubuko.com,布布扣
 1 #include <iostream>
 2 using namespace std;
 3 
 4 typedef long long LL;
 5 LL sum;
 6 const int size = 1000010;
 7 int arr[size];
 8 int temp[size];
 9 
10 void merge( int left , int mid , int right )
11 {
12     int p , q , i;
13     p = i = left , q = mid+1;
14     while( p<=mid || q<=right )
15     {
16         if( q>right || ( p<=mid && arr[p]<=arr[q] ) )
17         {
18             temp[i++] = arr[p++];
19         }
20         else
21         {
22             temp[i++] = arr[q++];
23             sum += mid-p+1;
24         }
25     }
26     for( i = left ; i<=right ; i++ )
27     {
28         arr[i] = temp[i];
29     }
30 }
31 
32 void merge_sort( int n )
33 {
34     int left , mid , right , len;
35     len = 1;
36     while( len <= n-1 )
37     {
38         left = 0;
39         while( left+len <= n-1 )
40         {
41             mid = left + len - 1;
42             right = mid + len;
43             if( right>n-1 )
44                 right = n-1;
45             merge( left , mid , right );
46             left = right + 1;
47         }
48         len *= 2;
49     }
50 }
51 
52 int main()
53 {
54     cin.sync_with_stdio(false);
55     int n;
56     while( cin >> n )
57     {
58         sum = 0;
59         for( int i = 0 ; i<n ; i++ )
60         {
61             cin >> arr[i];
62         }
63         merge_sort( n );
64         cout << sum << endl;
65     }
66     return 0;
67 }
View Code

 

 

bubuko.com,布布扣
 1 #include <iostream>
 2 using namespace std;
 3 
 4 typedef long long LL;
 5 LL sum;
 6 const int size = 1000010;
 7 int arr[size];
 8 
 9 void merge( int left , int mid , int right )
10 {
11     int p , q , i;
12     p = left , q = mid+1;
13     int* temp = new int[right-left+1];
14     i = 0;
15     while( p<=mid || q<=right )
16     {
17         if( q>right || ( p<=mid && arr[p]<=arr[q] ) )
18         {
19             temp[i++] = arr[p++];
20         }
21         else
22         {
23             temp[i++] = arr[q++];
24             sum += mid-p+1;
25         }
26     }
27     for( int k = 0 , i = left ; i<=right ; i++ , k++ )
28     {
29         arr[i] = temp[k];
30     }
31     delete []temp;
32 }
33 
34 void merge_sort( int n )
35 {
36     int left , mid , right , len;
37     len = 1;
38     while( len <= n-1 )
39     {
40         left = 0;
41         while( left+len <= n-1 )
42         {
43             mid = left + len - 1;
44             right = mid + len;
45             if( right>n-1 )
46                 right = n-1;
47             merge( left , mid , right );
48             left = right + 1;
49         }
50         len *= 2;
51     }
52 }
53 
54 int main()
55 {
56     cin.sync_with_stdio(false);
57     int n;
58     while( cin >> n )
59     {
60         sum = 0;
61         for( int i = 0 ; i<n ; i++ )
62         {
63             cin >> arr[i];
64         }
65         merge_sort( n );
66         cout << sum << endl;
67     }
68     return 0;
69 }
View Code

 

today:

  寒门出贵子,

  白屋出公卿。

  将相本无种,

  男儿当自强。

 

hdu--3743--归并排序<自顶向下&&自底向上>2种写法

标签:style   blog   http   color   os   io   for   ar   art   

原文地址:http://www.cnblogs.com/radical/p/3940147.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!