归并排序求逆序数
来源:互联网 发布:数据采集系统电路图 编辑:程序博客网 时间:2024/05/16 01:54
/* * 归并排序是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为 * 若干个子序列,每个子序列是有序的,然后再把有序的子序列合并为整体有序序列 * 归并排序是分治算法的一个典型的应用,而且是稳定的一种排序,这题利用归并排序 * 的过程中,计算每个小区间的逆序数,进而得到大区间的逆序数。那么,问题就解决了。 * */ #include <stdio.h> #define max 1000001 long long a[max],b[max]; long long count; void Merge(long long a[], int start, int mid , int end) //归并排序的合并部分 { int i = start,j = mid + 1,k = start; while(i <= mid&&j <= end) { if(a[i] <= a[j]) { b[k++] = a[i++]; } else { count += j - k; b[k++] = a[j++]; } } while(i <= mid) { b[k++] = a[i++]; } while(j <= end) { b[k++] = a[j++]; } for(int i = start; i <= end; i++) { a[i] = b[i]; } } void MergeSort(long long a[], int start, int end) //归并排序 { if(start < end) { int mid = (start + end)/2; MergeSort(a,start,mid); // 将前半部分排序 MergeSort(a,mid+1,end); // 将后半部分排序 Merge(a,start,mid,end); // 合并前后两个部分 } } int main(int argc, char const *argv[]) { int n,m; scanf("%d",&n); while(n--) { scanf("%d",&m); count = 0; for(int i = 0; i < m; i++) { scanf("%d",a+i); } MergeSort(a,0,m-1); printf("%lld\n",count); } return 0; }
0 0
- 归并排序,求逆序数
- 归并排序求逆序数
- 归并排序求逆序数
- 归并排序求逆序数
- 归并排序求逆序数
- 归并排序求逆序数
- 归并排序求逆序数
- 归并排序求逆序数
- 归并排序求逆序数
- 归并排序求逆序数
- 归并排序求逆序数
- 归并排序求逆序数
- 求逆序数(归并排序)
- 归并排序求逆序数
- 归并排序&求逆序数
- 归并排序求逆序数
- 归并排序求逆序数
- 归并排序,求逆序数
- 关于并发与并行
- win 32多线程程序设计读书笔记
- maven私服上传jar
- eclipse搭建ssh框架(三)
- 云数据库 Redis 版
- 归并排序求逆序数
- XML做带边框的背景drawable
- 第一个Spring Boot程序
- 网络游戏的粗略模块划分
- Newtonsoft.Json 序列化和反序列化
- jQuery判断checkbox是否选中的3种方法
- 2017/1/6 日志
- Java使用websocket和WebRTC实现视频通话
- 304. Range Sum Query 2D