ACM第二站————归并排序
转载请注明出处,谢谢!http://www.cnblogs.com/Asimple/p/5459664.html
归并排序————二分的思想
以中间的数为基准,每次排序都将比其小【升序排】(大【降序排】)的数放在前面,将比其大(小)的数放在后面。
一直重复,知道只有一个数的时候,自然有序。
最后合并分好的有序区间。
总体就是:组间无序,组内有序。
代码如下【升序】:
#include <stdlib.h>
#include <stdio.h>
#define MAX 1000001 int a[MAX], b[MAX]; void Merge(int a[], int low, int mid, int high)
{
int i = low, j=mid+, k = low;
while(i!=mid+ && j!=high+)
{
if(a[i] >= a[j])
b[k++] = a[j++];
else
b[k++] = a[i++];
}
while(i != mid+)
b[k++] = a[i++];
while(j != high+)
b[k++] = a[j++];
for(i=low; i<=high; i++)
a[i] = b[i];
} void MergeSort(int a[], int low, int high)
{
int mid;
if(low < high)
{
mid = (low + high) / ;
MergeSort(a, low, mid);//前面部分
MergeSort(a, mid+, high);//后面的部分
Merge(a, low, mid, high);//合并
}
} int main()
{
int i, n;
scanf("%d",&n);
for(i=; i<n; i++) scanf("%d",&a[i]);
MergeSort(a, , n-);
for(i=; i<n; i++)
printf("%d ", a[i]);
printf("\n");
return ;
}
似乎这样结束太过草率哈!来一个例子吧!归并的应用:
求逆序数
题目描述:
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。
现在,给你一个N个元素的序列,请你判断出它的逆序数是多少。
比如 1 3 2 的逆序数就是1。
输入:
第一行输入一个整数T表示测试数据的组数(1<=T<=5)
每组测试数据的每一行是一个整数N表示数列中共有N个元素(2〈=N〈=100000)
随后的一行共有N个整数Ai(0<=Ai<1000000000),表示数列中的所有元素。
数据保证在多组测试数据中,多于10万个数的测试数据最多只有一组。
输出:
输出该数列的逆序数。
2
2
1 1
3
1 3 2
0
1 题解代码【归并的方法】:
#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;
}
ACM第二站————归并排序的更多相关文章
- ACM第二站————STL之stack
栈,作为一种最基础的数据结构(栈还是一种内存的存储形式,就不介绍了),在各种数据结构的题目都会间接或者直接用到. 栈是一种受到限制的线性表,其限制是仅允许在表的一端进行插入和删除运算.这也给予了栈的一 ...
- Javascript之旅——第二站:对象和数组
一觉睡到中午,本来准备起来洗洗继续睡,不过想想没辙,还得继续这个系列,走过变量的第一站,第二站我们再来看看对象和数组. 一:对象 说起对象,我们不自然就想起了面向对象中自封装的一个类,同样JS中也 ...
- LWIP network interface 即 LWIP 的 硬件 数据 接口 移植 详解 STM32 以太网数据 到达 的第二站: void ethernetif_input( void * pvParameters )
根据 上一篇 文章 , ETH DMA 数据中断 会 发送 一个信号量 ,我使用 全局 搜索 这个信号量 s_xSemaphore 得到 一下 几个 值 根据 这个 分析 我们找到了 数据 的 ...
- 小白学习django第二站-模版配置
上一站说道app创建,接下来我们来配置app的url路由 首先需要到setting.py中添加book这个app, 再到django_test文件里的urls添加路由 include() : 这个函数 ...
- CSS之旅——第二站 如何更深入的理解各种选择器
上篇我们说了为什么要使用css,这篇我们就从选择器说起,大家都知道浏览器会把远端过来的html解析成dom模型,有了dom模型,html就变成 了xml格式,否则的话就是一堆“杂乱无章”的string ...
- ACM第二次比赛( C )
Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Description Vanya ...
- AcWing:109. 天才ACM(倍增 + 归并排序)
给定一个整数 MM,对于任意一个整数集合 SS,定义“校验值”如下: 从集合 SS 中取出 MM 对数(即 2∗M2∗M 个数,不能重复使用集合中的数,如果 SS 中的整数不够 MM 对,则取到不能取 ...
- MySql轻松入门系列——第二站 使用visual studio 对mysql进行源码级调试
一:背景 1. 讲故事 上一篇说了mysql的架构图,很多同学反馈说不过瘾,毕竟还是听我讲故事,那这篇就来说一说怎么利用visual studio 对 mysql进行源码级调试,毕竟源码面前,不谈隐私 ...
- asp.net mvc 之旅—— 第二站 窥探Controller下的各种Result
平时我们在Action中编码的时候,我们都知道所有的Action返回值类型都是ActionResult,并且我们的返回值也是各种奇葩,比如:Json(),Content(), View()等等...当 ...
随机推荐
- iOS如何统计渠道
http://bbs.umeng.com/thread-10-1-1.html https://www.zhihu.com/question/20697933
- 修改RMAN list命令输出的时间格式
根据需要,修改rman list命令输出结果的时间显示 $ rman target / Recovery Manager: Release - Production on Wed Jul :: Cop ...
- hduoj 4708 Rotation Lock Puzzle 2013 ACM/ICPC Asia Regional Online —— Warmup
http://acm.hdu.edu.cn/showproblem.php?pid=4708 Rotation Lock Puzzle Time Limit: 2000/1000 MS (Java/O ...
- Python学习总结4:字符串常量与操作汇总
参考博客:http://www.cnblogs.com/Camilo/archive/2013/09/21/3332267.html http://www.cnblogs.com/SunWentao/ ...
- .NET: 防止多个应用程序同时开
用到了Mutex这个类,直接看代码~ using System; using System.Collections.Generic; using System.Linq; using System.W ...
- 认真学习shell的第一天-数学运算
shell中的数学运算有三种方式: (1)let,用let的时候,变量名称前不用添加$ (2)[],[]中变量可使用也可不使用$ (3)(())变量名之前必须添加$
- php获取文件后缀名格式
function get_extension($file) { substr(strrchr($file, '.'), 1); } 第2种方法: function get_extension($fil ...
- 也不知怎么了LVS.SH找不到,网上搜了一篇环境搭配CENTOS下面的高可用 参考
系统环境: ************************************************************ 两台服务器都装了 CentOS-5.2-x86_64 系统 Vir ...
- u盘安装centos
1. 下载centos系统2. 使用UltraISO制作u盘启动.制作方法:http://jingyan.baidu.com/article/a378c960630e61b329283045.html ...
- 【python】标准库的大致认识
正如那句 Python 社区中很有名的话所说的:“battery included”,Python 的一大好处在于它有一套很有用的标准库(standard library).标准库是随着 Python ...