稳定排序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; ...
随机推荐
- 20155308《网络对抗》Exp8 Web基础
20155308<网络对抗>Exp8 Web基础 实践原理与实践说明 本实践的具体要求有: (1).Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与P ...
- 20155311《网络对抗》Web安全基础实践
20155311<网络对抗>Web安全基础实践 基础问题回答 SQL注入攻击原理,如何防御? 原理:SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL ...
- NetWork——描述一次完整的网络请求过程
台根DNS,根DNS服务器收到请求后会返回负责这个域名(.net)的服务器的一个IP,本地DNS服务器使用该IP信息联系负责.net域的这台服务器.这台负责.net域的服务器收到请求后,如果自己无法解 ...
- 汇编 ADD指令
知识点: 加法汇编指令ADD 一.加法指令 ADD(Addition) 格式 格式: ADD A,B //A=A+B; 功能: 两数相加 . OPRD1为任一通用寄存器或存储器操作数,可以是任意一个 ...
- python 回溯法 子集树模板 系列 —— 5、取物搭配问题
问题 有5件不同的上衣,3条不同的裤子,4顶不同的帽子,从中取出一顶帽子.一件上衣和一条裤子作为一种搭配,问有多少种不同的搭配? 分析 换个角度看,现有头.身.腿三个元素,每个元素都有各自的几种状态. ...
- 杂谈---小故事小道理,面试中的小技巧(NO.2)
本篇是接着上一篇面试随笔的,上一次有猿友反应写的有些“扯淡”,LZ思来想去最大的原因可能是由于上一章写的全是一些大忌,既然是大忌,那么在现实当中发生的概率还是相对较小的,大部分人还是很少在面试中犯如此 ...
- jmeter --http属性管理器
1,http请求默认值 2,HTTP授权管理器 3,HTTP缓存管理 4,HTTP cookie 管理器 5,HTTP头文管理器
- Jenkins报表 代码 指标分析
Jenkins报表 这表现在前面的章节中,也有可用最简单的一种是适用于 JUnit 测试报告的许多报表插件. 在生成后动作进行任何工作,你可以定义要创建的报告. 该构建已经完成,测试结果选项将可进一步 ...
- 基于Activiti工作流引擎实现的请假审核流程
概要 本文档介绍的是某商用中集成的Activiti工作流的部署及使用,该框架用的Activiti版本为5.19.0.本文档中主要以一个请假流程为例子进行说明,该例子的流程图如下: 这是一个可以正常运作 ...
- Linux内核分析——第一周学习笔记20135308
第一周 计算机是如何工作的 第一节 存储程序计算机工作模型 1.冯·诺依曼结构模型:冯·诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构.程序指令存储地址和数据存储 ...