生活随笔
收集整理的這篇文章主要介紹了
哦,这是桶排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
漫畫:什么是桶排序?
要了解桶排序之前,可以先看看上面小灰的那篇文章,我覺得是比較不錯的。
桶排序也可以理解為分類排序,把不同的數據歸類,歸類之后再重新排序,每個桶里面的內容就是一類數據,然后對每個桶里面的數據進行排序。
至于需要多少個桶,我們可以根據每個桶能裝的數據數量來反推計算。
比如我們有一千個數據 1000。
我們每個桶的數據區間是 200。
那我們就需要 1000/200 = 5個桶來裝這些數據。
? ? 0?~200
200?~400
400 ~600
600?~800
800?~1000
我們看維基百科官方的圖片解析
排序之前
排序之后
上代碼
#include?"stdio.h"
#include?"string.h"#define?BUCKET_NUM??5???/*桶排序中桶的個數*/
#define?BUCKET_STEP?200?/*假設需要排序的最大數值是?1000/5,10個桶,每個桶的范圍是?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));/*數據放到對應的桶里面*/for(i=0;i<n;i++){if(arr[i]<=BUCKET_STEP){??for(j=0;j<n;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<n;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<n;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<n;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<n;j++){if(buck[4][j]?==?0){buck[4][j]?=?arr[i];break;}}}else{printf("error?arr[%d]=%d?\n",i,arr[i]);}}/*調試打印*/for(i=0;i<BUCKET_NUM;i++)for(j=0;j<n;j++)if(buck[i][j]!=?0)?printf("%d?",buck[i][j]);printf("\n");/*對桶里面的數據進行排序*/for(i=0;i<BUCKET_NUM;i++){for(j=0;j<n;j++){for(k=0;k<n-1-j;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<BUCKET_NUM;i++)for(j=0;j<n;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<sizeof(arr)/sizeof(arr[0]);i++)printf("%d?",arr[i]);printf("\n");bucket_sort(arr,sizeof(arr)/sizeof(arr[0]));return?0;
}
這個代碼的思路我大概說一下,桶的數量和區間我先確定好了,然后呢,我把數據放到對應的桶里面去。
再然后呢,我使用冒泡排序把每個小桶里面的數據排序了一次。
原理上很簡單。
如果我們把桶的數量確定為1,然后一個桶把所有的數據都存下來,這就是計數排序了,除了冒泡排序之外,我覺得計數排序是一種很容易記住的排序算法。桶排序其實有點啰嗦,原理不錯,但是如果處理一些小數據的話,作用很小。
程序輸出
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$
推薦閱讀:
專輯|Linux文章匯總
專輯|程序人生
專輯|C語言
我的知識小密圈
總結
以上是生活随笔為你收集整理的哦,这是桶排序的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。