众所周知,Std::sort()是一个非常快速的排序算法,它基于快排,但又有所修改。一般来说用它就挺快的了,代码一行,时间复杂度O(nlogn)(难道不是大叫一声“老子要排序!!”就排好了么。。。)。我们也知道,不基于比较的排序可以达到O(n),比如说基数排序。什么,它是O(n * log(10)( max(n) ) ) 的?NO!!我们可以用sqrt(max(n))来作为进制,这样就是(N*logMax(n))=O(2*n)的了。。看起来很不错, 代码量嘛。。。。呵呵

  所谓基数排序,就是做几次筒排,每一位一次,然后拉直,然后继续,时间复杂度O(n),我们来看一下效果吧

  Data1:10^7随机数据

  Data2:10^7不随机,从10^7到0

  Data3:第二个数据每一项除与2,10^7项

  Data4:第一个数据每一项除与2,10^7项

  效果:

  std::sort()

  1.7.07s

  2.5.51s

  3.7.00s

  4.5.31s

  基数排序

  1.5.31s

  2.7.26s

  3.4.89s

  4.7.06s

  觉得很奇怪,其实一四是对应的,二三是对应的。。。然后为什么会这样。。。不懂不懂。。。

  分析一下,可能是读入原因,或者std::sort()对一些特殊的有优化,但是很大可能是——Cena抽了。。。

  基数排序在排序上优化还是挺大的,但是,代码量和常数还有适用范围。。。呵呵

  本文纯粹太无聊作死只做,我不会说std::sort()在评测的时候连续4次75分,每次无输出的点还不一样。。。Cena啊,你何时出1.0啊。。。

  付:我写的基数排序极丑代码。。。

  

 #include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib> using namespace std;
struct num
{
int data;
num* next;
}nu[]; void plu(num *f,num *b)
{
f->next=b;
} num* t[];
num* e[];
void add(int pos,num* l)
{
if (e[pos])
{
e[pos]->next=l;
e[pos]=l;
}
else
{
t[pos]=l;
e[pos]=l;
}
} int predo()
{
int n,ret=;
scanf("%d",&n);
for (int i=;i<=n;++i)
{
int j;
scanf("%d",&j);
nu[i].data=j;
nu[i].next=nu+i+;
if (i==n) nu[i].next=NULL;
ret=max(ret,j);
}
return ret;
}
num* root=nu+; void JSsort(int n)
{
for (num* now=root;now;)
{
num* nex=now->next;
now->next=NULL;
int tt=now->data%n;
add(tt,now);
now=nex;
}
num* last=NULL;
for (int i=;i<n;++i)
{
if (t[i])
{
if (!last)
{
root=t[i];
}
else
{
last->next=t[i];
}
for (num *now=t[i];now;now=now->next)
last=now;
}
t[i]=e[i]=NULL;
}
for (num* now=root;now;)
{
num* nex=now->next;
now->next=NULL;
int tt=now->data/n;
add(tt,now);
now=nex;
}
last=NULL;
for (int i=;i<n;++i)
{
if (t[i])
{
if (!last)
{
root=t[i];
}
else
{
last->next=t[i];
}
for (num *now=t[i];now;now=now->next)
last=now;
}
}
return;
} void print()
{
for (num* now=root;now;now=now->next)
{
printf("%d ",now->data);
}
printf("\n");
return;
} int main()
{
freopen ("sort.in","r",stdin);
freopen ("sort.out","w",stdout);
int k=predo();
JSsort(sqrt(k)+);
print();
return ;
}

最新文章

  1. js 固话正则
  2. mysql 时间戳 按周、日、月 统计方法 附 date格式
  3. ASP.NET Web API与Rest web api
  4. 实践2.4 ELF文件格式分析
  5. 基于.NET的大型Web站点StackOverflow架构分析(转)
  6. vs2013 设置为中文版
  7. 安装360后,visual studio 经常报各种莫名其妙的错误的解决方案
  8. Android viewPage notifyDataSetChanged无刷新
  9. 事物复制中大项目(Large Article)出问题如何快速修复
  10. Never-build package &#39;XXXX&#39; requires always-build package &#39;EhLib70&#39;
  11. JPA的介绍
  12. Jmeter自动化测试工具的简单使用--HTTP测试
  13. Golang语言的入门开始
  14. 表关联ID相同数据update修改
  15. python的基本用法(四)文件操作使用
  16. 总结Sql Server内置函数实现MD5加密
  17. 测试一体机ASM Disk online操作
  18. Win10系列:C#应用控件基础5
  19. Delphi XE5 for Android (七)
  20. gocommand:一个跨平台的golang命令行执行package

热门文章

  1. python list排序(正倒)以及获取重复数据
  2. 3.2.1.1 POSIX方括号表达式
  3. 百练2755:神奇的口袋(简单dp)
  4. mybatis写当天 当月的数据 时间段数据https://www.cnblogs.com/xzjf/p/7600533.html
  5. BNUOJ 5966 Rank of Tetris
  6. CTF常用在线工具总结
  7. Ubuntu 16.04通过Unity Tweak Tool实现点击图标最小化
  8. 重啓ubuntu后 VNC 自動運行
  9. STL源代码剖析(二) - 迭代器与traits技法
  10. [LeetCode][Java] N-Queens II