稳定排序nlogn之归并排序_一维,二维
稳定排序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之归并排序_一维,二维的更多相关文章
- 一维二维Sparse Table
写在前面: 记录了个人的学习过程,同时方便复习 Sparse Table 有些情况,需要反复读取某个指定范围内的值而不需要修改 逐个判断区间内的每个值显然太浪费时间 我们希望用空间换取时间 ST表就是 ...
- 基于ZXing.Net生成一维二维码
新阁教育-喜科堂付工原创 最近很多小伙伴对一维码.二维码比较感兴趣,今天主要给大家分享一个C#生成条形码和二维码的案例. C#作为一个高级语言,特点就是快! 我们使用的是开源库ZXing,ZXing是 ...
- c++ 依据输入动态声明数组(一维,二维)
较早的编译器是不同意这样做的,所以一些书籍比方以Tc解说的书本都说数组的下标不能是变量.在vc6.0下亦是如此. 只是在一些较新的编译器如dev c++已经支持了,例如以下代码不会报错 #includ ...
- C# 链表去重 List 一维 二维 分别使用 Distinct() GroupBy() 方法
分别使用List中Distinct(),GroupBy()实现链表的去重. 1.先上效果: 一维链表中分别有元素“aa”,"bb",'aa','aa',"cc" ...
- java 数组基础学习(一维二维数组)
1.一维数组 1>静态初始化:数据类型[ ] 变量名 = {元素} 例:int[ ] arr = {1,2} 动态初始化:数据类型[ ] 变量名 = new数据类型[数据长度] 例:int[ ] ...
- 【VBA】利用Range声明Array(一维/二维)
[说明] B2开始到B?(中间不能有空格),定义一维数组Arr_approver() Dim R_sh As Worksheet Set R_sh = ThisWorkbook.Sheets(&quo ...
- Java中一维,二维数组的静态和动态初始化
今天我们要开始来讲讲Java中的数组,包括一维数组和二维数组的静态初始化和动态初始化 数组概述: 数组可以看成是多个相同类型数据的组合,对这些数据的统一管理; 数组变量属于引用数据类型,数组也可以看成 ...
- matlab学习——05插值和拟合(一维二维插值,拟合)
05插值和拟合 1.一维插值 (1) 机床加工零件,试用分段线性和三次样条两种插值方法计算.并求x=0处的曲线斜率和13<=x<=15范围内y的最小值. x0=[0 3 5 7 9 11 ...
- 树状数组(一维&二维函数)
//一维 void add(int x,int p) { while(x<=n)t[x]+=p,x+=(x&(-x)); } int query(int x) { int ans=0; ...
随机推荐
- 20155317《网络对抗》Exp4 恶意代码分析
20155317<网络对抗>Exp4 恶意代码分析 基础问题回答 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用 ...
- Vue 项目集合
饿了么安全应急响应中心 饿了么招聘 饿了么前端 · GitHub 稀土掘金 异乡好居 明星垂搜 广州建管 基于Vue.js的数据统计系统(一) 基于Vue.js的数据统计系统(二) 基于Vue.js的 ...
- 为什么要进行阿里云云计算助理工程师认证(ACA)
阿里云助理工程师认证(ACA - Alibaba Cloud Certification Associate)是面向使用阿里云基础产品的专业技术认证,主要涉及阿里云的计算.存储.网络.安全类的核心产品 ...
- SQLServer数据库还原:无法在已有的mdf文件上还原文件
如果提示无法在已有的mdf文件上还原文件,请修改如下位置
- R绘图 第九篇:绘制散点图和气泡图(ggplot2)
绘制散点图(scatterplots)使用geom_point()函数,气泡图(bubblechart)也是一个散点图,只不过点的大小由一个变量(size)来控制.散点图潜在的最大问题是过度绘图:当一 ...
- Java 中的 try catch 影响性能吗?
前几天在 code review 时发现有一段代码中存在滥用try catch的现象.其实这种行为我们也许都经历过,刚参加工作想尽量避免出现崩溃问题,因此在很多地方都想着 try catch一下. 但 ...
- 大白话说Java泛型:入门、使用、原理
文章首发于[博客园-陈树义],点击跳转到原文<大白话说Java泛型:入门.使用.原理> 远在 JDK 1.4 版本的时候,那时候是没有泛型的概念的.当时 Java 程序员们写集合类的代码都 ...
- MVC的多页面后台管理系统
MVC的多页面后台管理系统 同样功能的后台管理系统,也是可以使用 ASP.NET MVC .Web API 和JQuery 来制作. 所有的功能都与Angular js的单页面相同.应用层所有的方法都 ...
- js获取浏览器对象的信息
js中有一个对象叫 navigator,navigator 对象包含有关浏览器的信息.所有的浏览器都支持该对象. 其中经常用到的是 navigator.userAgent 属性,通常,它是在 navi ...
- Js_字体滚动换颜色
<html><head><meta http-equiv="Content-Type" content="text/html; charse ...