1. 程式人生 > >排序!——神奇的排序!!

排序!——神奇的排序!!

max color code str 般的 pre 二次 pla .com

這是一個有趣的排序方法

我不知道該叫它什麽。。桶排序??!!的確有桶排序的部分吧。

姑且叫它——桶升(升級版的桶排序)

這個算法我是從一個標程上看到的

第一次看的時候看不懂。

第二次看才發現它的奇妙

普通的桶排序滿足不了a[i]>=1e8以上的情況。

可是這個“桶升”卻能滿足a[i]^(1/2)<1e8

並且它的復雜度和桶排一樣是O(n)

我在洛谷上交了這樣一題:【模板】快速排序

技術分享
#include<iostream>
#include<cstdio>
#include<cstring> 
using namespace std;
const int
maxn=100010; const int num=32767; int n,a[maxn],nxt[maxn],cnt[num+1]; int get(int x,int k){ if(!k)return x&num; return (x>>15)&num; } void rsort(){ for(int k=0;k<=1;k++){ memset(cnt,0,sizeof(cnt)); for(int i=1;i<=n;i++)++cnt[get(a[i],k)]; for(int i=1
;i<=num;i++)cnt[i]+=cnt[i-1]; for(int i=n;i;i--)nxt[cnt[get(a[i],k)]--]=a[i]; for(int i=1;i<=n;i++)a[i]=nxt[i]; } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); rsort(); for(int i=1;i<=n;i++)printf("%d ",a[i]); return
0; }
View Code

跑得比一般的快得多。

本文由Yzyet編寫,網址為www.cnblogs.com/Yzyet。非Yzyet同意,禁止轉載,侵權者必究。

排序!——神奇的排序!!