稳定排序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. POJ 1988&&2236

    并查集,如果只是朴素的路径压缩,那么也就是一句话的事情. 但是,一般都没有这种仁慈的裸题(假的,多了去了) 1988:带权并查集,贼鸡儿像Luogu的那道杨威利的并查集(好像是叫银河英雄传说) 开两个 ...

  2. adr adrl ldr mov总结整理

    ADR这是一条小范围的地址读取伪指令,它将基于PC的相对偏移的地址值读到目标寄存器中.     使用的格式:ADR register,exper.     在编译源程序时,汇编器首先计算出当前PC值( ...

  3. VS新建一个模板工程

    新建一个模板工程的好处:    1.就不用每次都走一边新建向导了,新建工程一步到位. 2.可以往项目中每次都的输入的代码,如一些声明注释-- 效果图: 具体步骤: 1.自己先新建一个属于自己的工程. ...

  4. C++中前置声明介绍

    前置声明是指对类.函数.模板或者结构体进行声明,仅仅是声明,不包含相关具体的定义.在很多场合我们可以用前置声明来代替#include语句. 类的前置声明只是告诉编译器这是一个类型,但无法告知类型的大小 ...

  5. 4字节emoji表情对应的Unicode编码获取和编码转换

    GitHub Flavored Markdown 今天研究了一天Markdown移动端和pc端统一实现方式,由于以前有搞过移动端富文本编辑器,搞Markdown简单多了: 其中GFM的表情语法不错,比 ...

  6. 自制一个H5图片拖拽、裁剪插件(原生JS)

    前言 如今的H5运营活动中,有很多都是让用户拍照或者上传图片,然后对照片加滤镜.加贴纸.评颜值之类的.尤其是一些拍照软件公司的运营活动几乎全部都是这样的. 博主也做过不少,为了省事就封装了一个简单的图 ...

  7. git 创建标签和删除标签

    创建标签 在Git中打标签非常简单,首先,切换到需要打标签的分支上: $ git branch * dev master $ git checkout master Switched to branc ...

  8. HTTP 和 HTTPS 直观上看哪里不一样了

    1. 我在自己搭建的 HTTP 网站上进行登陆测试 填写账号和密码,账号:123456 ,密码:654321 (当然是乱填的,只为了看传输数据) 点击登录,用wireshark抓包看看传输的数据 2. ...

  9. ubuntu 12.04下 eclipse的安装

    1首先下载有关的JDK sudo apt-get install openjdk-7-jre 由于是源内的东西,所以只许执行上面这一步,就自动帮你下载 安装 以及配置,无需繁琐的操作. 这里ubunt ...

  10. 【转】Mysql事务,并发问题,锁机制

    转自:http://www.cnblogs.com/fidelQuan/p/4549068.html 1.什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点. 原子性:要不全部成 ...