码迷,mamicode.com
首页 > 编程语言 > 详细

【排序】归并排序+逆序对应用

时间:2014-11-25 23:26:45      阅读:298      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   ar   color   os   sp   for   on   

 

 1 void merge_sort(int *A, int x, int y, int *T)
 2 {//x为左端点,y为右端点
 3     //
 4     if(y-x<=1)  return ;
 5     int m = x + (y-x)/2;//划分
 6     int p = x, q = m, i = x;
 7     //递归
 8     merge_sort(A, x, m, T);
 9     merge_sort(A, m, y, T);
10     //归并
11     while(p < m || q < y)//只要有一个序列非空,就继续排序
12     {
13         if((q >= y) || (p < m && A[p] <= A[q]))
14         {//若 第二个序列为空(第一个必非空)|| 两个均非空且A[p] <= A[q]时,将左半数组元素复制到临时空间
15             T[i++] = A[p++];
16         }
17         else
18         {//否则 第二个序列非空 && (p >= m || A[p] > A[q]时,将右半数组元素复制到临时空间
19             T[i++] = A[q++];
20             //cnt += m-p;
21         }
22     }
23     for(int i = x; i < y; i++)  {A[i] = T[i];}
24 }

 

逆序对应用:

由于合并操作时从小到大进行的,当右边的A[j]复制到T中时,左边还没来得及复制到T中的数就是所有左边比A[j]大的数。此时只要在累加器中计入左边元素个数m-p即可。(左边所剩元素在[m, p)区间内)

bubuko.com,布布扣
 1 void merge_sort(int *A, int x, int y, int *T)
 2 {//x为左端点,y为右端点
 3     //
 4     if(y-x<=1)  return ;
 5     int m = x + (y-x)/2;//划分
 6     int p = x, q = m, i = x;
 7     //递归
 8     merge_sort(A, x, m, T);
 9     merge_sort(A, m, y, T);
10     //归并
11     while(p < m || q < y)//只要有一个序列非空,就继续排序
12     {
13         if((q >= y) || (p < m && A[p] <= A[q]))
14         {//若 第二个序列为空(第一个必非空)|| 两个均非空且A[p] <= A[q]时,将左半数组元素复制到临时空间
15             T[i++] = A[p++];
16         }
17         else
18         {//否则 第二个序列非空 && (p >= m || A[p] > A[q])时,将右半数组元素复制到临时空间
19             T[i++] = A[q++];
20             cnt += m-p; //计数
21         }
22     }
23     for(int i = x; i < y; i++)  {A[i] = T[i];}
24 }
View Code

 

【排序】归并排序+逆序对应用

标签:style   blog   http   ar   color   os   sp   for   on   

原文地址:http://www.cnblogs.com/LLGemini/p/4121960.html

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