转载请注明出处,谢谢!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第二站————归并排序的更多相关文章

  1. ACM第二站————STL之stack

    栈,作为一种最基础的数据结构(栈还是一种内存的存储形式,就不介绍了),在各种数据结构的题目都会间接或者直接用到. 栈是一种受到限制的线性表,其限制是仅允许在表的一端进行插入和删除运算.这也给予了栈的一 ...

  2. Javascript之旅——第二站:对象和数组

    一觉睡到中午,本来准备起来洗洗继续睡,不过想想没辙,还得继续这个系列,走过变量的第一站,第二站我们再来看看对象和数组. 一:对象   说起对象,我们不自然就想起了面向对象中自封装的一个类,同样JS中也 ...

  3. LWIP network interface 即 LWIP 的 硬件 数据 接口 移植 详解 STM32 以太网数据 到达 的第二站: void ethernetif_input( void * pvParameters )

    根据 上一篇 文章 , ETH  DMA 数据中断 会 发送 一个信号量 ,我使用 全局 搜索 这个信号量 s_xSemaphore 得到 一下 几个 值 根据 这个 分析  我们找到了   数据 的 ...

  4. 小白学习django第二站-模版配置

    上一站说道app创建,接下来我们来配置app的url路由 首先需要到setting.py中添加book这个app, 再到django_test文件里的urls添加路由 include() : 这个函数 ...

  5. CSS之旅——第二站 如何更深入的理解各种选择器

    上篇我们说了为什么要使用css,这篇我们就从选择器说起,大家都知道浏览器会把远端过来的html解析成dom模型,有了dom模型,html就变成 了xml格式,否则的话就是一堆“杂乱无章”的string ...

  6. ACM第二次比赛( C )

    Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Description Vanya ...

  7. AcWing:109. 天才ACM(倍增 + 归并排序)

    给定一个整数 MM,对于任意一个整数集合 SS,定义“校验值”如下: 从集合 SS 中取出 MM 对数(即 2∗M2∗M 个数,不能重复使用集合中的数,如果 SS 中的整数不够 MM 对,则取到不能取 ...

  8. MySql轻松入门系列——第二站 使用visual studio 对mysql进行源码级调试

    一:背景 1. 讲故事 上一篇说了mysql的架构图,很多同学反馈说不过瘾,毕竟还是听我讲故事,那这篇就来说一说怎么利用visual studio 对 mysql进行源码级调试,毕竟源码面前,不谈隐私 ...

  9. asp.net mvc 之旅—— 第二站 窥探Controller下的各种Result

    平时我们在Action中编码的时候,我们都知道所有的Action返回值类型都是ActionResult,并且我们的返回值也是各种奇葩,比如:Json(),Content(), View()等等...当 ...

随机推荐

  1. Maven开发环境的搭建,含jetty调试[简单明了]

    之前的一片老文,搬过来. 1. Maven的开发环境需要哪些部件a) Maven.去http://maven.apache.org/ 下载.将其bin目录加入进系统PATH.测试方法:用命令mvn – ...

  2. devexpress13学习系列(四)PDFViewer(4)

    PdfViewer的属性: CurrentPageNumber:显示当前页的页码. DocumentFilePath:当前文件. DocumentProperties:文件属性. PageCount: ...

  3. TPageControl组件

    TPageControl的功能是创建多个Dialog页,而这些重叠的每一个页Dialog就是通过TTabSheet对象实现的

  4. [原创]java WEB学习笔记47:Servlet 监听器简介, ServletContext(Application 对象), HttpSession (Session 对象), HttpServletRequest (request 对象) 监听器,利用listener理解 三个对象的生命周期

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  5. Could not create the view: An unexpected exception was thrown.如何解决

    今天打开Myeclipse10的时候,发现server窗口出现一堆问题,问题如标题,然后下方出现了一堆java.lang.NullPointerException的问题. java.lang.Null ...

  6. server端推送消息机制

    推送技术相关请参加WIKI: https://zh.wikipedia.org/wiki/%E6%8E%A8%E9%80%81%E6%8A%80%E6%9C%AF 场景: 监控系统:后台硬件温度.电压 ...

  7. oracle的函数

    1:nvl函数 nvl函数将一个null值转换为一个实际的值,数据类型可以是日期,数字,字符,数据类型必须匹配,vl能够转换任何数据类型,但是转换的数据类型返回值必须是nvl(expr1,expr2) ...

  8. Java中的数组操作进阶

    package com.mi.array; import java.util.Arrays; /** * System.arraycopy(i, 0, j, 0, i.length);这种复制会覆盖目 ...

  9. 搞笑的u盘图片

  10. php 下载保存文件保存到本地的两种方法

    第一种: 1 <? ?> 或 <?php //下载文件保存到本地//www.jbxue.comfunction downfile($fileurl){ob_start(); $fil ...