文章目录

  • 解法1:直接双重循环求解,n*n复杂度
  • 解法2:采用归并排序求解,复杂度nlgn

题目链接 http://poj.org/problem?id=1804
题目大意:
让一串无序数,在只能相邻数字交换的前提下,最短的次数变成有序,求该最短次数。
该最短次数=该序列的逆序数

解法1:直接双重循环求解,n*n复杂度

#include<iostream>
#include<cstring>
using namespace std;
int main()
{const int N = 1001;int cyctime,len,len1,sum=0;int arr[N];int i=0,j=0,k=0,temp;memset(arr,0,sizeof(int)*N);cin >> cyctime;for(i = 0; i < cyctime; ++i){//cin.clear();cin >> len;len1=len;j=0;while(len1--) //先输入数组{cin >> temp;arr[j++] = temp;}for(j = 0; j < len; ++j)    //从前往后依次比较{for(k = j+1; k < len; ++k){if(arr[j]>arr[k]){sum++;}}}cout << "Scenario #" << i+1 << ":" << endl;cout << sum << endl << endl;sum = 0;}return 0;
}

解法2:采用归并排序求解,复杂度nlgn

#include<iostream>
#include<cstring>
using namespace std;
int sum=0;
void merge(int *arr,size_t left,size_t mid,size_t right)
{int len = right - left + 1;int *temp = new int [len];  //数组较长时请用new,不然栈空间容易溢出size_t index = 0;size_t i = left, j = mid + 1;while(i <= mid && j <= right){if(arr[i]<=arr[j]){temp[index++] = arr[i++];}else{temp[index++] = arr[j++];sum += mid - i + 1;       //左边数比右边大,那么左边剩余的也比其大!!!!!!!!!!}//对两边的数组从小到大放入临时空间}while(i <= mid)     //比较完后,左半边有没放进去的,直接写入{temp[index++]= arr[i++];}while(j <= right)   //比较完后,右半边有没有放进去的,直接写入{temp[index++]= arr[j++];}for(int k = 0;k< len;++k){arr[left++ ]= temp[k];  //把有序的临时数组写入原来数组的起始位置}delete [] temp;  //释放空间temp = NULL;  //指针置空
}
void divide(int *arr,size_t left,size_t right)
{if(left == right){   return;}size_t mid = (left+right)/2;  //找出区间中部的数,将数组分段divide(arr,left,mid);  //递归调用,对左边继续分段;divide(arr,mid+1,right);  //递归调用,对右边继续分段;merge(arr,left,mid,right); //对左右两半进行排序合并成一小段有序的数组
}
void mergesort(size_t dsize, int *arr)
{if(dsize <= 1)  //预防特殊情况下后面代码失效{return;}size_t left = 0, right = dsize-1;divide(arr,left,right);
}int main()
{const int N = 1001;int cyctime,len,len1;int arr[N];int i=0,j=0,temp;memset(arr,0,sizeof(int)*N);cin >> cyctime;for(i = 0; i < cyctime; ++i){//cin.clear();cin >> len;len1=len;j=0;while(len1--) //先输入数组{cin >> temp;arr[j++] = temp;}mergesort(len,arr);cout << "Scenario #" << i+1 << ":" << endl;cout << sum << endl << endl;sum = 0;}return 0;
}

由上可看出归并排序求解时间效率更高。

POJ 1804 逆序数 解题(归并排序)相关推荐

  1. ACM_逆序数(归并排序)

    帮挂科 Time Limit: 2000/1000ms (Java/Others) 64bit IO Format: %lld & %llu Problem Description: 冬瓜发现 ...

  2. 逆序数介绍以及算法实现

    前言 线性代数中对于一段数字序列的排列情况有这样一个定义:在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. ...

  3. POJ 1804 Brainman (归并排序 -- 求逆序对数)

    归并排序求逆序对数: 和归并排序一样,划分和递归求解都好理解,关键在于合并,对于右边的j ,统计出左边比j 大 的元素个数 f(j),所有的f(j)家和就是我们要的逆序对数! 在归并排序中,我们将右边 ...

  4. LeetCode 315. 计算右侧小于当前元素的个数(二叉查找树二分查找归并排序逆序数总结)

    文章目录 1. 题目 2. 解题 2.1 二叉查找树 2.2 二分插入 2.3 归并排序 1. 题目 给定一个整数数组 nums,按要求返回一个新数组 counts.数组 counts 有该性质: c ...

  5. 分治递归逆序数_[模板] 归并排序 逆序数 分治

    归并排序 图来自维基 递归调用的过程需要在脑中模拟清楚 然后是代码的细节问题 多复习多理解 刘汝佳版 #include using namespace std; const int MAXN = 1e ...

  6. 【排序】归并类排序—归并排序(逆序数问题)

    文章目录 前言 归并排序(merge sort) 逆序数 结语 微信公众号:bigsai 数据结构与算法专栏 前言 在排序中,我们可能大部分更熟悉冒泡排序.快排之类.对归并排序可能比较陌生.然而事实上 ...

  7. 逆序数问题(归并排序,C++)

    在求解八数码问题时,因为要进行逆序数的计算判断两个结点的可达性,同奇偶的逆序数才能可达.如果只是八数,暴力解法还好,当数字多了之后如何知道逆序数呢. 题目描述 通过计算八数码节点的逆序数判断.如果一对 ...

  8. 八十二、归并排序求取复杂的逆序数

    @Author:Runsen 逆序数,我在很多的面试题都见过,本质上来说难度是比较大,因为如果使用暴力法当数据量一大,必然就会爆掉.你现在就要记住逆序数就是考归并排序. 逆序数 给定一个数组array ...

  9. 【归并排序】-求逆序数算法

    1.归并排序 归并排序是分治法的一种典型应用,应用递归思想,自顶向下思考:先假定MergeSort()可以将一个乱序数组排好序,因此可以开始分(将一个数组平均分成两部分),再治(分别调用MergeSo ...

最新文章

  1. 【贪心】Google Code Jam Round 1A 2018 Waffle Choppers
  2. POJ_1151 Atlantis(线段树)
  3. 这些贷款合同陷阱你知道多少?
  4. Excel实用函数大全(名称、功能、说明、用法、举例)
  5. linux中第一个进程的形成,Linux进程管理
  6. sqlserver实验心得体会_SQLServer数据库实训总结
  7. Node.js摸石头系列目录
  8. 杭电2112(SPFA)
  9. 实体商店与虚拟商店购买保护流程:
  10. 厉害!一年两登顶刊的31岁浙大硕导荣获杰青!
  11. 计算机显卡模式,电脑bios设置显卡图解
  12. 刘汝佳第二章习题(前四)
  13. 极点五笔状态栏菜单不显示,如何再让它显示?
  14. 怎么申请https证书
  15. [转]Discuz 模板原理分析
  16. 2018 rust卡石头教程_rust地上的石头怎么捡 | 手游网游页游攻略大全
  17. 高红梅:第三章 第二节 身份焦虑与英雄梦
  18. 计算机软件侵害,如何认定侵害计算机软件著作权?
  19. 七牛云对象存储设置自己的域名访问(阿里云的域名)
  20. 20220321在MT6739的android8.1下调试GPIO引脚

热门文章

  1. php 多进程 常驻内存,PHP 多进程与信号中断实现多任务常驻内存管理 [Master/Worker 模型]...
  2. linux pmap was java,jvm 《九》pmap linux 命令介绍 及使用
  3. IO流--buffer
  4. 前端面试之前要准备的那些事
  5. BotVS开发基础—2.1 账户、行情、K线、深度
  6. vim 常用快捷键总结
  7. [翻译] python Tutorial 之一
  8. ubuntu命令行登录
  9. 一个整数转换成字符串(C/C++自己写的算法)
  10. 双一流大学毕业的我,应该何去何从?