哦,這是桶排序
要了解桶排序之前,可以先看看上面小灰的那篇文章,我覺(jué)得是比較不錯(cuò)的。
桶排序也可以理解為分類排序,把不同的數(shù)據(jù)歸類,歸類之后再重新排序,每個(gè)桶里面的內(nèi)容就是一類數(shù)據(jù),然后對(duì)每個(gè)桶里面的數(shù)據(jù)進(jìn)行排序。
至于需要多少個(gè)桶,我們可以根據(jù)每個(gè)桶能裝的數(shù)據(jù)數(shù)量來(lái)反推計(jì)算。
比如我們有一千個(gè)數(shù)據(jù) 1000。
我們每個(gè)桶的數(shù)據(jù)區(qū)間是 200。
那我們就需要 1000/200 = 5個(gè)桶來(lái)裝這些數(shù)據(jù)。
? ? 0?~200
200?~400
400 ~600
600?~800
800?~1000

我們看維基百科官方的圖片解析

排序之前

排序之后
上代碼
#include?"stdio.h"
#include?"string.h"
#define?BUCKET_NUM??5???/*桶排序中桶的個(gè)數(shù)*/
#define?BUCKET_STEP?200?/*假設(shè)需要排序的最大數(shù)值是?1000/5,10個(gè)桶,每個(gè)桶的范圍是?1000/10?=??100*/
int?bucket_sort(int?*arr,int?n)
{
????int?i,j,k,m;
????int?buck[BUCKET_NUM][n];
????memset(buck,0,sizeof(buck));
????/*數(shù)據(jù)放到對(duì)應(yīng)的桶里面*/
????for(i=0;i????{
????????if(arr[i]<=BUCKET_STEP){??
????????????for(j=0;j????????????????if(buck[0][j]?==?0){
????????????????????buck[0][j]?=?arr[i];
????????????????????break;
????????????????}
????????????}
????????}else?if(arr[i]?>?BUCKET_STEP?&&?arr[i]???<=?2*BUCKET_STEP){
????????????for(j=0;j????????????????if(buck[1][j]?==?0){
????????????????????buck[1][j]?=?arr[i];
????????????????????break;
????????????????}
????????????}
????????}else?if(arr[i]?>?2*BUCKET_STEP?&&?arr[i]?<=?3*BUCKET_STEP){
????????????for(j=0;j????????????????if(buck[2][j]?==?0){
????????????????????buck[2][j]?=?arr[i];
????????????????????break;
????????????????}
????????????}
????????}else?if(arr[i]?>?3*BUCKET_STEP?&&?arr[i]?<=?4*BUCKET_STEP){
????????????for(j=0;j????????????????if(buck[3][j]?==?0){
????????????????????buck[3][j]?=?arr[i];
????????????????????break;
????????????????}
????????????}
????????}else?if(arr[i]?>?4*BUCKET_STEP?&&?arr[i]?<=?5*BUCKET_STEP){
????????????for(j=0;j????????????????if(buck[4][j]?==?0){
????????????????????buck[4][j]?=?arr[i];
????????????????????break;
????????????????}
????????????}
????????}else{printf("error?arr[%d]=%d?\n",i,arr[i]);}
????}
????/*調(diào)試打印*/
????for(i=0;i????????for(j=0;j?????????if(buck[i][j]!=?0)?printf("%d?",buck[i][j]);printf("\n");
????/*對(duì)桶里面的數(shù)據(jù)進(jìn)行排序*/
????for(i=0;i????????for(j=0;j????????????for(k=0;k????????????????if(?buck[i][k]?>?buck[i][k+1])?{/*交換*/
????????????????????buck[i][k]?^=?buck[i][k+1];
????????????????????buck[i][k+1]?^=?buck[i][k];
????????????????????buck[i][k]?^=?buck[i][k+1];
????????????????}
????????????}
????????}
????}
????/*打印*/
????for(i=0;i????????for(j=0;j?????????if(buck[i][j]!=?0)?printf("%d?",buck[i][j]);printf("\n");????
}
int?main()
{
????int?i;
????int?arr[20]?=?{12,12,1,78,500,5,7,699,752,233,1,13,399,599,500,462,801,699,19,345};
????for(i=0;i????????printf("%d?",arr[i]);printf("\n");
????bucket_sort(arr,sizeof(arr)/sizeof(arr[0]));
????return?0;
}
這個(gè)代碼的思路我大概說(shuō)一下,桶的數(shù)量和區(qū)間我先確定好了,然后呢,我把數(shù)據(jù)放到對(duì)應(yīng)的桶里面去。
再然后呢,我使用冒泡排序把每個(gè)小桶里面的數(shù)據(jù)排序了一次。
原理上很簡(jiǎn)單。
如果我們把桶的數(shù)量確定為1,然后一個(gè)桶把所有的數(shù)據(jù)都存下來(lái),這就是計(jì)數(shù)排序了,除了冒泡排序之外,我覺(jué)得計(jì)數(shù)排序是一種很容易記住的排序算法。桶排序其實(shí)有點(diǎn)啰嗦,原理不錯(cuò),但是如果處理一些小數(shù)據(jù)的話,作用很小。
程序輸出
weiqifa@bsp-ubuntu1804:~/c$?gcc?tongpaixu.c?&&?./a.out
12?12?1?78?500?5?7?699?752?233?1?13?399?599?500?462?801?699?19?345
12?12?1?78?5?7?1?13?19?233?399?345?500?599?500?462?699?752?699?801
1?1?5?7?12?12?13?19?78?233?345?399?462?500?500?599?699?699?752?801
weiqifa@bsp-ubuntu1804:~/c$

評(píng)論
圖片
表情
