数组中的逆序对 代码(C)

本文地址: http://blog.csdn.net/caroline_wendy

题目: 在数组中的两个数字假设前面一个数字大于后面的数字, 则这两个数字组成一个逆序对.

输入一个数组, 求出这个数组中的逆序对的总数.

使用归并排序的方法, 辅助空间一个排序的数组, 依次比較前面较大的数字, 算出总体的逆序对数, 不用逐个比較.

时间复杂度: O(nlogn)

代码:

/*
* main.cpp
*
* Created on: 2014.6.12
* Author: Spike
*/ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h>
#include <stdlib.h>
#include <string.h> int InversePairsCore(int* data, int* copy, int start, int end) {
if (start == end) {
copy[start] = data[start];
return 0;
}
int length = (end-start)/2;
int left = InversePairsCore(copy, data, start, start+length);
int right = InversePairsCore(copy, data, start+length+1, end); int i = start+length; //前半段最后一个数字的下标
int j = end;
int indexCopy = end;
int count = 0;
while (i>=start && j>=start+length+1) {
if (data[i] > data[j]) {
copy[indexCopy--] = data[i--];
count += j-start-length;
} else {
copy[indexCopy--] = data[j--];
}
}
for (; i>=start; --i)
copy[indexCopy--] = data[i];
for (; j>=start+length+1; --j)
copy[indexCopy--] = data[j];
return left+right+count; } int InversePairs (int* data, int length) {
if (data == NULL || length < 0)
return 0;
int *copy = new int[length];
for (int i=0; i<length; ++i)
copy[i] = data[i];
int count = InversePairsCore(data, copy, 0, length-1);
delete[] copy;
return count;
} int main(void)
{
int data[] = {7, 5, 6, 4};
int result = InversePairs (data, 4);
printf("result = %d\n", result); return 0;
}

输出:

result = 5

最新文章

  1. 【C#】【Thread】BackgroundWorker的使用
  2. JSP页面组件
  3. runtime之玩转成员变量
  4. ACM/ICPC 之 树形DP(POJ1192)
  5. shell字符串判空
  6. Java核心知识点学习----线程同步工具类,CyclicBarrier学习
  7. Mac版 MicrosoftOffice2015 办公软件 破解教程
  8. 1306.Sequence Median(堆排序)
  9. tomcat管理web界面
  10. JavaScript树(一) 简介
  11. PHP基本随笔
  12. SPOJ - AMR11E
  13. 从public void onPreviewFrame(byte[] data, Camera arg1)拿到Bitmap(收集)
  14. 2018-2019-1 20189206 《Linux内核原理与分析》第七周作业
  15. MVC源码分析 - ModelBinder绑定 / 自定义数据绑定
  16. c#关于路径的总结(转)
  17. K均值算法
  18. Linux文本编辑器(九)
  19. kendo datetimepicker
  20. Python 数据类型:元组

热门文章

  1. CAS配置(3)之restful-api接入接口
  2. CentOS7 搭建Kafka(二)kafka篇
  3. Oracle 数据导入导出(imp/exp)
  4. python练习--1、简易登录接口
  5. LinkedList 源码
  6. 黑客常用dos命令
  7. java mongodb 使用MongoCollection,BasicDBObject 条件查询
  8. Having子句用法
  9. 团体程序设计天梯赛-练习集-L1-032. Left-pad
  10. java源码