排序 基數排序 C

2021-10-08 18:03:18 字數 3912 閱讀 6737

2.執行結果

3.演算法實現

1.基數排序是在箱排序的基礎之上進行擴充套件和完善的

2.通過判斷待排序的陣列中的位數,決定進行建立箱子的個數和遍歷的次數.

例如:待排序中最多的位數為3位,那麼就需要建立三個箱子(當然也可以建立兩個,進行復用,記得復用之前要清除之前的箱子),這裡我就不復用了.那麼需要進行遍歷三次

3.開始排序(就是遍歷裝箱操作)

3.1:第一次遍歷待排序的陣列.進行第一次裝箱(箱子a),按照個數進行裝到對應的箱子.

3.2:第二次順序遍歷前面的箱子(箱子a),進行第二次裝箱(箱子b),按照十位數進行裝到對應的箱子中.

3.3:第三次順序遍歷前面的箱子(箱子b),進行第三次裝箱(箱子c),按照百位數進行裝到對應的箱子中.

到了這裡已經排序完成,還差最後一步.

4.組裝資料,順序遍歷最後一次的箱子(箱子c).儲存到乙個陣列中,此時陣列中的資料就是已經排序好的.

例如:上面的箱子,順序遍歷這個箱子a儲存到箱子b中.(按照十位儲存)

讀取0號桶:

第乙個數:200, 十位為0, 儲存箱子b中0號桶[200]

第二個數:100, 十位為0, 儲存箱子b中0號桶[200,100]

讀取1號桶:

第乙個數:211, 十位為1, 儲存箱子b中1號桶[211]

讀取2號桶:

沒有值跳過

讀取3號桶:

第乙個數:143, 十位為4, 儲存箱子b中4號桶[143]

第二個數:433, 十位為3, 儲存箱子b中3號桶[433]

讀取4號桶:

第乙個數:84, 十位為4, 儲存箱子b中8號桶[84]

第二個數:134, 十位為3, 儲存箱子b中3號桶[433,134]

第三個數:534, 十位為3, 儲存箱子b中3號桶[433,134,534]

第四個數:994, 十位為9, 儲存箱子b中9號桶[994]

…後面的就不一一舉例了.直到遍歷結束.

//鍊錶結點 順序儲存箱子中數值,這樣就可以不用限制資料量.

typedef

struct snodenode;

//箱子中的每個鍊錶

typedef

struct listlinklist;

//箱子列表

typedef

struct radixboxrb;

//入隊

void

insertlist

(linklist *list,

int value)

;//列印佇列

void

loglist

(linklist *list)

;//列印箱子

void

logradixbox

(rb rb)

;//列印箱子--陣列型別

void

logradixboxarray

(rb rb)

;//裝箱操作

//type:1->除數為1*10 2:除數為2*20

void

enradixbox

(int type,rb rb,

int value)

;//基數排序

void

radixsort

(void

);

//列印佇列

void

loglist

(linklist *list)

else

p=p->next;

}printf

("]\n");

}}//列印箱子

void

logradixbox

(rb rb)

logradixboxarray

(rb)

;printf

("********************************\n");

}//列印箱子--陣列型別

void

logradixboxarray

(rb rb)

else

printf

(",%d"

,p->value)

; p=p->next;}}

printf

("]\n");

}//入隊

void

insertlist

(linklist *list,

int value)

//3.將新的結點插入鍊錶

if(list->header==

null)if

(list->rear==

null

)else

}//裝箱操作

//type->0:個數,1:十位,2:百位的餘數

void

enradixbox

(int type,rb rb,

int value)

//2.計算位置

//134: 134%10

//134: (134/10)%10

//134: (134/100)%10

//(value/(pow(10,type)))%10

int position=((

int)

(value/

(int

)pow(10

, type)))

%10; linklist *list= rb.boxs[position]

;insertlist

(list,value);}

//基數排序

void

radixsort

(void);

printf

("未排序:");

logarray

(array, n)

;//2.首先要知道陣列中最大的是幾位數,就需要幾個箱子,從個位到最高位順序裝箱

//初始化箱子

rb rbs[3]

;//初始化三個箱子

for(i=

0;i<

3;i++)}

//3.開始裝箱

for(i=

0;i<

3;i++

)logradixbox

(rbs[i]);

}else}}

logradixbox

(rbs[i]);

}}//4.遍歷最後乙個箱子裝入陣列,就是排好序的

node *p;

i=0;

for(j=

0;jprintf

("已排序:");

logarray

(array, n)

;}

我這裡迴圈遍歷的時候,第一次是遍歷待排序的資料,然後進行裝箱,剩下的順序遍歷,是遍歷上一次的箱子.

優化點:

1.建立箱子的時候,可以建立乙個個箱子

2.每次裝完箱子操作後,可以先順序遍歷箱子,順序儲存到陣列中.然後下一次遍歷的時候,是遍歷裝箱後的陣列.這樣就是每次都是遍歷陣列,進行裝箱.

3.在決定迴圈幾次的時候,我這裡知道待排序中的陣列,最大的是3位數,

3.1這裡可以寫乙個快速查詢方法,尋找最大位數,或者最大值.

3.2或者是在第一次裝箱的時候,同時查詢最大位數(n)也可以,這樣後面迴圈的就是再進行(n-1)次.

基數排序 C

首先我們引入乙個多關鍵排序的概念 多關鍵字排序 假如現在有乙個員工表,要求按照薪資排序,年鈴相同的員工按照年齡排序。比如氣泡排序就是一種穩定排序,堆排序就是不穩定的排序,品,你細細的品 那麼對32,13,94,52,17,54,93排序,是否可以看做多關鍵字排序?比如32 13 52排序,先看個位2...

基數排序(c )

題目描述 根據輸入,輸出基數排序的每趟排序結果。輸入格式 輸入數字為正整數,先輸入排序數字個數,然後輸入需要排序的數字序列。輸出 每趟排序結果。要求 程式需要實現排序,其他可以使用stl包。示例測試集 輸入 8 2343666 152310 5594 592783278 輸出 152310 2343...

c 基數排序

題目和我的前幾個排序一樣 include using namespace std int arrlength int arr 測出int陣列的長度 遞迴,找出陣列最大的值 param arrays 陣列 param l 左邊界,第乙個數 param r 右邊界,陣列的長度 return int fi...