稳定排序nlogn之归并排序_一维,二维

稳定排序:排序时间稳定的排序

稳定排序包括:归并排序(nlogn),基数排序【设待排序列为n个记录,d个关键码,关键码的取值范围为radix,则进行链式基数排序的时间复杂度为O(d(n+radix)) 】,冒泡排序(n^2),插入排序(n^2),交换排序(n^2),计数排序【n为数字个数,k为数字范围,O(n+k)】等。

Problem:对n个数进行排序,n<=100000,1s以内

快速排序平均时间复杂度为nlogn,最坏时间复杂度为n^2。c,c++中的快速排序qsort(c),sort(c++)有优化(如随机化等),基本上达到O(nlogn),但是不是特别稳定。

Solution:

用归并排序,时间复杂度稳定在O(nlogn)。

n=10000           nlogn=132877

n=100000         nlogn=1660964

n=1000000       nlogn=19931568

其中2^10=1024,2^20=1024*1024约为1000000

Code:

一维和二维的区别在于数据类型的不同和比较方式的不同

一维:

 #include <stdio.h>
#include <stdlib.h>
#define maxn 100000 long a[maxn+],b[maxn+]; void mergesort(long l,long r)
{
long mid;
mid=(l+r) >> ;
if (l!=mid) mergesort(l,mid);
if (mid+!=r) mergesort(mid+,r);
long i,j,k;
for (i=l;i<=r;i++)
b[i]=a[i];
i=l;
j=mid+;
k=l;
while (i<=mid && j<=r)
{
if (b[i]<b[j])
{
a[k]=b[i];
i++;
k++;
}
else
{
a[k]=b[j];
j++;
k++;
}
}
if (i<=mid)
{
while (i<=mid)
{
a[k]=b[i];
i++;
k++;
}
}
else
{
while (j<=r)
{
a[k]=b[j];
j++;
k++;
}
}
} int main()
{
long n,i;
scanf("%ld",&n);
for (i=;i<=n;i++)
scanf("%ld",&a[i]);
mergesort(,n);
printf("\n");
for (i=;i<=n;i++)
printf("%ld ",a[i]);
printf("\n");
return ;
}
/*
5
4 2 3 5 1
*/

二维:

 #include <stdio.h>
#include <stdlib.h>
#define maxn 100000 struct node
{
long x,y;
}; struct node a[maxn+],b[maxn+]; void mergesort(long l,long r)
{
long mid;
mid=(l+r) >> ;
if (l!=mid) mergesort(l,mid);
if (mid+!=r) mergesort(mid+,r);
long i,j,k;
for (i=l;i<=r;i++)
b[i]=a[i];
i=l;
j=mid+;
k=l;
while (i<=mid && j<=r)
{
if (b[i].x<b[j].x || (b[i].x==b[j].x && b[i].y<b[j].y))
{
a[k]=b[i];
i++;
k++;
}
else
{
a[k]=b[j];
j++;
k++;
}
}
if (i<=mid)
{
while (i<=mid)
{
a[k]=b[i];
i++;
k++;
}
}
else
{
while (j<=r)
{
a[k]=b[j];
j++;
k++;
}
}
} int main()
{
long n,i;
scanf("%ld",&n);
for (i=;i<=n;i++)
scanf("%ld%ld",&a[i].x,&a[i].y);
mergesort(,n);
printf("\n");
for (i=;i<=n;i++)
printf("%ld %ld\n",a[i].x,a[i].y);
printf("\n");
return ;
}
/*
5
1 2
5 5
4 4
2 3
2 2
*/

稳定排序nlogn之归并排序_一维,二维的更多相关文章

  1. 一维二维Sparse Table

    写在前面: 记录了个人的学习过程,同时方便复习 Sparse Table 有些情况,需要反复读取某个指定范围内的值而不需要修改 逐个判断区间内的每个值显然太浪费时间 我们希望用空间换取时间 ST表就是 ...

  2. 基于ZXing.Net生成一维二维码

    新阁教育-喜科堂付工原创 最近很多小伙伴对一维码.二维码比较感兴趣,今天主要给大家分享一个C#生成条形码和二维码的案例. C#作为一个高级语言,特点就是快! 我们使用的是开源库ZXing,ZXing是 ...

  3. c++ 依据输入动态声明数组(一维,二维)

    较早的编译器是不同意这样做的,所以一些书籍比方以Tc解说的书本都说数组的下标不能是变量.在vc6.0下亦是如此. 只是在一些较新的编译器如dev c++已经支持了,例如以下代码不会报错 #includ ...

  4. C# 链表去重 List 一维 二维 分别使用 Distinct() GroupBy() 方法

    分别使用List中Distinct(),GroupBy()实现链表的去重. 1.先上效果: 一维链表中分别有元素“aa”,"bb",'aa','aa',"cc" ...

  5. java 数组基础学习(一维二维数组)

    1.一维数组 1>静态初始化:数据类型[ ] 变量名 = {元素} 例:int[ ] arr = {1,2} 动态初始化:数据类型[ ] 变量名 = new数据类型[数据长度] 例:int[ ] ...

  6. 【VBA】利用Range声明Array(一维/二维)

    [说明] B2开始到B?(中间不能有空格),定义一维数组Arr_approver() Dim R_sh As Worksheet Set R_sh = ThisWorkbook.Sheets(&quo ...

  7. Java中一维,二维数组的静态和动态初始化

    今天我们要开始来讲讲Java中的数组,包括一维数组和二维数组的静态初始化和动态初始化 数组概述: 数组可以看成是多个相同类型数据的组合,对这些数据的统一管理; 数组变量属于引用数据类型,数组也可以看成 ...

  8. matlab学习——05插值和拟合(一维二维插值,拟合)

    05插值和拟合 1.一维插值 (1) 机床加工零件,试用分段线性和三次样条两种插值方法计算.并求x=0处的曲线斜率和13<=x<=15范围内y的最小值. x0=[0 3 5 7 9 11 ...

  9. 树状数组(一维&二维函数)

    //一维 void add(int x,int p) { while(x<=n)t[x]+=p,x+=(x&(-x)); } int query(int x) { int ans=0; ...

随机推荐

  1. 20155317《网络对抗》Exp4 恶意代码分析

    20155317<网络对抗>Exp4 恶意代码分析 基础问题回答 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用 ...

  2. Vue 项目集合

    饿了么安全应急响应中心 饿了么招聘 饿了么前端 · GitHub 稀土掘金 异乡好居 明星垂搜 广州建管 基于Vue.js的数据统计系统(一) 基于Vue.js的数据统计系统(二) 基于Vue.js的 ...

  3. 为什么要进行阿里云云计算助理工程师认证(ACA)

    阿里云助理工程师认证(ACA - Alibaba Cloud Certification Associate)是面向使用阿里云基础产品的专业技术认证,主要涉及阿里云的计算.存储.网络.安全类的核心产品 ...

  4. SQLServer数据库还原:无法在已有的mdf文件上还原文件

    如果提示无法在已有的mdf文件上还原文件,请修改如下位置

  5. R绘图 第九篇:绘制散点图和气泡图(ggplot2)

    绘制散点图(scatterplots)使用geom_point()函数,气泡图(bubblechart)也是一个散点图,只不过点的大小由一个变量(size)来控制.散点图潜在的最大问题是过度绘图:当一 ...

  6. Java 中的 try catch 影响性能吗?

    前几天在 code review 时发现有一段代码中存在滥用try catch的现象.其实这种行为我们也许都经历过,刚参加工作想尽量避免出现崩溃问题,因此在很多地方都想着 try catch一下. 但 ...

  7. 大白话说Java泛型:入门、使用、原理

    文章首发于[博客园-陈树义],点击跳转到原文<大白话说Java泛型:入门.使用.原理> 远在 JDK 1.4 版本的时候,那时候是没有泛型的概念的.当时 Java 程序员们写集合类的代码都 ...

  8. MVC的多页面后台管理系统

    MVC的多页面后台管理系统 同样功能的后台管理系统,也是可以使用 ASP.NET MVC .Web API 和JQuery 来制作. 所有的功能都与Angular js的单页面相同.应用层所有的方法都 ...

  9. js获取浏览器对象的信息

    js中有一个对象叫 navigator,navigator 对象包含有关浏览器的信息.所有的浏览器都支持该对象. 其中经常用到的是 navigator.userAgent 属性,通常,它是在 navi ...

  10. Js_字体滚动换颜色

    <html><head><meta http-equiv="Content-Type" content="text/html; charse ...