归并排序和逆序数
来源:互联网 发布:金融数据终端 编辑:程序博客网 时间:2024/04/29 20:46
归并排序通过分治的思想可以在nlogn的时间内完成数组的排序
同时在归并排序的归并过程中,又可以通过排序内部的细节获得原数组的逆序数,见注释
直接上代码了:
void merge(int a[],int start,int len,int size){int l=0,r=0;int mid=start+len/2;int lsize=min(len/2+len%2,size-start); //左边集合的个数int rsize=min(len,size-start)-lsize; //右边集合的个数int *al=(int *)malloc(sizeof(int)*(lsize));int *ar=(int *)malloc(sizeof(int)*(rsize));for(int i=start;i<start+lsize;i++){al[i-start]=a[i];}for(int i=start+lsize;i<start+lsize+rsize;i++){ar[i-start-lsize]=a[i];}int k=0;for(k=0;l<lsize&&r<rsize;k++){if(al[l]<=ar[r]){a[start+k]=al[l];l++;}else{a[start+k]=ar[r];ans+=lsize-l; //此时左边集合还有lsize-l个数没有放,则意味着对于右边集合的第一个数,前面有lsize-l个数比它还要大,故逆序数加上lsize-lr++; }}if(k<lsize+rsize){if(l<lsize){for(int i=l;i<lsize;i++){a[start+k]=al[i];k++;}}else{for(int i=r;i<rsize;i++){a[start+k]=ar[i];k++;}}}free(ar);free(al);}void mergesort(int a[],int size){for(int len=2;len<size*2;len*=2){for(int i=0;i<size;i+=len){ merge(a,i,len,size);}}}
0 0
- 归并排序和逆序数
- 归并排序,逆序数
- 归并排序 逆序数
- 归并排序+逆序数
- 归并排序 + 逆序数
- 归并排序和求逆序数对
- 归并排序和求逆序数
- 归并排序/归并排序求逆序数
- 归并排序,求逆序数
- 归并排序求逆序数
- 逆序数--归并排序-nyoj117
- 归并排序求逆序数
- 归并排序求逆序数
- 归并排序求逆序数
- 归并排序求逆序数
- 归并排序求逆序数
- 归并排序求逆序数
- 归并排序求逆序数
- Virtio:针对 Linux 的 I/O 虚拟化框架
- http://blog.csdn.net/dm_vincent/article/details/7769159
- 将十进制数字转换为二十六进制字母串
- iOS开发-检测用户截屏, 并获取所截图片
- Java数据类型转换(简单类型、封装类型、String)
- 归并排序和逆序数
- cgi 编程的get和post
- 实体
- php开发手机网站注意事项
- getRequestDispatcher()与sendRedirect()的区别
- cocos2dx 控件学习EditBox TableView ControlSlider ScrollView
- mysql 时间转换 长整型时间 时间戳类型时间
- 程序员技术练级攻略
- poj 2318 TOYS(叉积+二分)