當前位置:編程學習大全網 - 源碼下載 - 求c語言基數排序與桶排序的源代碼

求c語言基數排序與桶排序的源代碼

基數排序:

#include<math.h>

testBS()

{

inta[]?=?{2,?343,?342,?1,?123,?43,?4343,?433,?687,?654,?3};

int?*a_p?=?a;

//計算數組長度

intsize?=?sizeof(a)?/?sizeof(int);

//基數排序

bucketSort3(a_p,?size);

//打印排序後結果

inti;

for(i?=?0;?i?<?size;?i++)

{

printf("%d\n",?a[i]);

}

intt;

scanf("%d",?t);

}

//基數排序

voidbucketSort3(int?*p,?intn)

{

//獲取數組中的最大數

intmaxNum?=?findMaxNum(p,?n);

//獲取最大數的位數,次數也是再分配的次數。

intloopTimes?=?getLoopTimes(maxNum);

inti;

//對每壹位進行桶分配

for(i?=?1;?i?<=?loopTimes;?i++)

{

sort2(p,?n,?i);

}

}

//獲取數字的位數

intgetLoopTimes(intnum)

{

intcount?=?1;

inttemp?=?num?/?10;

while(temp?!=?0)

{

count++;

temp?=?temp?/?10;

}

returncount;

}

//查詢數組中的最大數

intfindMaxNum(int?*p,?intn)

{

inti;

intmax?=?0;

for(i?=?0;?i?<?n;?i++)

{

if(*(p?+?i)?>?max)

{

max?=?*(p?+?i);

}

}

returnmax;

}

//將數字分配到各自的桶中,然後按照桶的順序輸出排序結果

voidsort2(int?*p,?intn,?intloop)

{

//建立壹組桶此處的20是預設的根據實際數情況修改

intbuckets[10][20]?=?{};

//求桶的index的除數

//如798個位桶index=(798/1)%10=8

//十位桶index=(798/10)%10=9

//百位桶index=(798/100)%10=7

//tempNum為上式中的1、10、100

inttempNum?=?(int)pow(10,?loop?-?1);

inti,?j;

for(i?=?0;?i?<?n;?i++)

{

introw_index?=?(*(p?+?i)?/?tempNum)?%?10;

for(j?=?0;?j?<?20;?j++)

{

if(buckets[row_index][j]?==?NULL)

{

buckets[row_index][j]?=?*(p?+?i);

break;

}

}

}

//將桶中的數,倒回到原有數組中

intk?=?0;

for(i?=?0;?i?<?10;?i++)

{

for(j?=?0;?j?<?20;?j++)

{

if(buckets[i][j]?!=?NULL)

{

*(p?+?k)?=?buckets[i][j];

buckets[i][j]?=?NULL;

k++;

}

}

}

}

桶排序

#include?<stdio.h>

#define?MAXNUM?100

void?bucksort(int?arr[],?int?N,?int?M)

{

int?count[MAXNUM];

for?(int?i=0;?i<=M;?i++)

{

count[i]=0;

}

for?(int?i=0;?i<N;?i++)

{

++count[arr[i]];

}

for?(int?i=0;?i<=M;?i++)

{

for?(int?j=1;?j<=count[i];?j++)

{

printf("%d?",i);

}

}

}

int?main()

{

int?a[]={2,5,6,12,4,8,8,6,7,8,8,10,7,6};

bucksort(a,sizeof(a)/sizeof(a[0]),12);

return?0;

}

  • 上一篇:大話西遊電影臺詞傷感經典對白錦集(40句)
  • 下一篇:鄉鎮安全生產整改報告範文(三篇)
  • copyright 2024編程學習大全網