面试:分而治之求逆序数

来源:互联网 发布:java线程池面试题 编辑:程序博客网 时间:2024/04/27 16:11

在并归排序的基础上实现逆序数计算,时间复杂度为O(N*log2N)

<span style="font-size:18px;">#include <iostream>using namespace std;int ret = 0;template <typename T>void mergeAdjust(T *target, T *src, int start, int mid, int end) {int temp = 0;int i = start;int j = mid + 1;int cnt = start;while(i <= mid && j <= end) {if(src[i] > src[j]) {target[cnt ++] = src[j ++];temp += mid - i + 1;} else {target[cnt ++] = src[i ++];}}while(i <= mid) {target[cnt ++] = src[i ++];}while(j <= end) {target[cnt ++] = src[j ++];}ret += temp;}template <typename T>void mergeSort(T *target, T *src, int start, int end) {if(start == end) {target[start] = src[start];return;}T buf[100];int mid = start + (end - start) / 2;mergeSort(buf, src, start, mid);mergeSort(buf, src, mid + 1, end);mergeAdjust(target, buf, start, mid, end);}int main(void) {//int a[] = {9, 8, 7, 6, 5, 4, 3, 2, 1};int a[] = {3, 2, 1, 4};int b[100];mergeSort(b, a, 0, 3);cout << ret << endl;return 0;}</span>


0 0
原创粉丝点击