淺入淺出---基數排序

作爲一個沒有學過算法的小白,說一下自己對基數排序的瞭解(可能理解不到位,以後深入理解的話再來更改)

首先呢說一下,基數排序的思想是啥。

基數排序呢有兩種方法,一種是低位優先,一種是高位優先,

看書上的例子:有一副撲克牌:(先隨意規定一個優先級)

花色:梅花<方塊<紅桃<黑桃

面值:A<2<3<.......<J<Q<K

高位優先:先把所有的排按照花色優先級排列,然後在按照面值從小到大去排列。也就是說,你有四個空,你把所有的牌放到四個空裏面,每個空有13張牌。

低位優先:先把所有的排按照面值排列好,然後在按照花色優先級去排列。也就是說你先分13個空,然後你再去把所有的牌一一的放到13個空相對的空。(通過反覆的進行分配和收集操作完成排序)

鏈式基數排序就是基於低位優先的思想排的。

舉個栗子:

有8個數字,{965,23231,5556,8748,485,57,236,911}

有五位數,有三位數,有兩位數

每個數字有“個十百千”位,砸門按照低位優先思想,也就說哦們先看個位的數字,我們先設置10個桶,把個位是1的數放到“1”的桶。


這就是第一遍排,

第二遍呢,就是比較十位,

第三遍就是比較百位,知道所有的數字的那一位都等於0,停止比較。

程序:我們可以先寫第一遍排序:

#include<stdio.h>
#include<stdlib.h>
//獲取個十百位的數字
int getNum(int num,int pos){
int temp=1;
for(int i=1;i<pos-1;i++){
temp*=10;
}
return (num/temp)%10;
}
int main(void){
int a[8]={965,23231,5556,8748,485,57,236,911};
//申請數組
int *Array[10];
//因爲位數上可能出現0-9這些數字,所以申請十個桶
for(int i=0;i<10;i++){
Array[i]=(int*)malloc(sizeof(int)*(9));
Array[i][0]=0;//第一個存放個數 

        //有八個數字,循環八次

for(int i=0;i<8;i++){
int num=getNum(a[i],1);//得到八個數字的位數
int index=++Array[num][0];//桶的第一個元素裏的值放的是該桶有多少個數字,爲了後面循環放入數組中做準備
Array[num][index]=a[i];//num 就是你桶的位置,index是你是該桶的第幾個元素
}
//收集
for(int i=0,j=0;i<10;i++){//這裏的10 可以隨意更改,因爲你一個數字的位數不確定
for(int k=1;k<=Array[i][0];k++)   //k是循環該桶數字的一個條件
a[j++]=Array[i][k];
Array[i][0]=0; //恢復桶第一個元素的值,因爲比較百位的時候,桶裏的值要重新填,所以要恢復

//循環輸出
for(int i=0;i<8;i++){
printf("%d\t",a[i]);
}
printf("\n");


循環百位,千位,不過就是給他分配與收集的過程加一個循環

#include<stdio.h>
#include<stdlib.h>
//獲取值
int getNum(int num,int pos){
int temp=1;
for(int i=1;i<pos-1;i++){
temp*=10;
}
return (num/temp)%10;
}
int main(void){
int a[8]={965,23231,5556,8748,485,57,236,911};
//申請數組
int *Array[10];

for(int i=0;i<10;i++){
Array[i]=(int*)malloc(sizeof(int)*(9));
Array[i][0]=0;//第一個存放個數 

//從個位開始比較
for(int pos=1;pos<=10;pos++){
for(int i=0;i<8;i++){
int num=getNum(a[i],pos);
int index=++Array[num][0];
Array[num][index]=a[i];
}


//收集
for(int i=0,j=0;i<10;i++){
for(int k=1;k<=Array[i][0];k++)
a[j++]=Array[i][k];
Array[i][0]=0;
}
for(int i=0;i<8;i++){
printf("%d\t",a[i]);
}
printf("\n"); 




呃呃呃,我理解的基數排序就是這樣。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章