稳定排序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; ...
随机推荐
- WPF编程,C#中对话框自动关闭的一种方法。
原文:WPF编程,C#中对话框自动关闭的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/details/8 ...
- python 回溯法 子集树模板 系列 —— 6、排课问题
问题 某乡村小学有六个年级,每个年级有一个班,共六个班. 周一到周五,每天上6节课,共计30节课. 开设的课程 一年级:语(9)数(9)书(2)体(2)美(2)音(2)德(2)班(1)安(1) 二年级 ...
- FormData 数据转化为 json 数据
两种方法 <!-- 实例:将 FormData 转化为 json --> <meta charset="utf-8"/> <form enctype= ...
- Spring Boot(十一):Spring Boot 中 MongoDB 的使用
MongoDB 是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配 ...
- 【Android UI设计与开发】第02期:引导界面(二)使用ViewPager实现欢迎引导页面
本系列文章都会以一个程序的实例开发为主线来进行讲解,以求达到一个循序渐进的学习效果,这样更能加深大家对于程序为什么要这样写的用意,理论加上实际的应用才能达到事半功倍的效果,不是吗? 最下方有源码的下载 ...
- 阿里云CentOS 7.4 64位,jdk1.6、mysql5.7、tomcat6部署步骤(个人记录)
jdk1.6.mysql5.7.tomcat6部署步骤 一.安装jdk1.6 查看当前系统jdk的版本:java -version 方法一:利用yum源来安装jdk(此方法不需要配置环境变量) 查看y ...
- CentOS 6.8 安装Tomcat7
一.下载Tomcat到服务器上 将Tomcat包下载到devleoper(没有此目录创建一个)目录下: 二.解压安装包 下载好之后,直接解压,使用命令: .tar.gz # 是否使用sudo权限执行根 ...
- HDU排序水题
1040水题; These days, I am thinking about a question, how can I get a problem as easy as A+B? It is fa ...
- unity小地图制作___按比例尺图标布局
1. 2.这里小地图显示的范围为整个空间区域,而不是单独的相机渲染区域 3. 4. 5. using System.Collections; using System.Collections.Gene ...
- B1022. D进制的A+B
除基取余法 #include<bits/stdc++.h> using namespace std; stack<int> s; int main(){ long long a ...