归并排序及利用归并排序求逆序对数
2016-02-27 14:53
232 查看
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; /* 用归并排序顺便完成统计逆序对数。 因为合并操作是从小到大进行的,当右边的a[q]复制到T中时,左边还没来得及复制到T中的那些数就是左边所有比a[q]大的数。 此时在累加器中加上左边的元素个数m-p即可(左边剩余元素在区间[p,m)中,因此元素个数为m-p.) */ int a[10] = { 2,1,7,9,13,11,12,20 }; int T[10]; int cnt; void MergeSort(int* a, int low, int high, int* T)//将数组a[low...high-1]从小到大排序,时间复杂度为O(nlogn) { if (low + 1 < high) { int mid = (low + high) / 2; MergeSort(a, low, mid, T);//排序a[low...(mid-1)] MergeSort(a, mid, high, T);//排序a[mid...(high-1)] int p = low, q = mid, i = low; while (p < mid || q < high)//只要有一个序列非空就继续合并 { if (q >= high || (p < mid&&a[p] < a[q])) //复制第一个序列: //①:第二个序列空了 //②:第二个序列非空并且第一个序列也非空且a[p]<a[q] T[i++] = a[p++]; else//复制第二个序列 { T[i++] = a[q++]; cnt += mid - p; for (int j = p; j < mid; j++)//输出逆序对 printf("%d -- %d\n", a[j], a[q - 1]); } } for (int i = low; i < high; i++) a[i] = T[i]; } } int main() { printf("原来数组是:\n"); for (int i = 0; i < 8; i++) printf("%d ", a[i]); printf("\n"); cnt = 0;//cnt是逆序对数 MergeSort(a, 0, 8, T); printf("排序后的数组是:\n"); for (int i = 0; i < 8; i++) printf("%d ", a[i]); printf("\n"); printf("逆序对数是:%d\n", cnt); return 0; }
相关文章推荐
- java实现归并排序算法
- C++实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等
- C++实现自底向上的归并排序算法
- C++实现自顶向下的归并排序算法
- Java实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等
- Java排序算法总结之归并排序
- C++归并排序算法实例
- Javascript排序算法之合并排序(归并排序)的2个例子
- 归并排序的递归实现与非递归实现代码
- java二路归并排序示例分享
- java实现归并排序算法
- 归并排序的实现代码与思路
- leetcode 虐我篇之(二) Two Sum
- In-place Merge Sort 原地并归排序
- 使用Java完成《算法导论》习题2.3-2
- 插入排序移动次数
- 归并排序 with Python
- 归并排序-逆序对的求解
- 排序算法的复杂度和稳定性
- 用python实现归并排序