www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > C語(yǔ)言編程
[導(dǎo)讀]01—基數(shù)排序算法思想輸入n個(gè)d位數(shù),現(xiàn)在要對(duì)n個(gè)數(shù)進(jìn)行排序,就需要設(shè)計(jì)一個(gè)排序算法法?;鶖?shù)排序算法思想:先對(duì)最低有效位采用穩(wěn)定排序算法進(jìn)行排序,然后從次最低有效位到最高有效位依次采用穩(wěn)定排序算法進(jìn)行排序,處理完最高有效位后則是最終排序后的結(jié)果。這里說(shuō)明一下什么是穩(wěn)定排序算法和不...



01

基數(shù)排序算法思想


輸入n個(gè)d位數(shù),現(xiàn)在要對(duì)n個(gè)數(shù)進(jìn)行排序,就需要設(shè)計(jì)一個(gè)排序算法法。基數(shù)排序算法思想:先對(duì)最低有效位采用穩(wěn)定排序算法進(jìn)行排序,然后從次最低有效位到最高有效位依次采用穩(wěn)定排序算法進(jìn)行排序,處理完最高有效位后則是最終排序后的結(jié)果。這里說(shuō)明一下什么是穩(wěn)定排序算法和不穩(wěn)定排序算法:大小相同的數(shù)字A和B分別在原始序列中的索引是x和y,且x>y。經(jīng)過(guò)排序后A和B分別所在輸出序列的索引是x1和y1,如果x1>y1,那么這個(gè)排序算法是穩(wěn)定的,如果x1而基數(shù)排序算法為什么一定要用穩(wěn)定排序算法進(jìn)行排序呢?因?yàn)椴环€(wěn)定排序算法會(huì)破壞相同數(shù)字的相對(duì)順序,舉個(gè)例子,現(xiàn)有輸入序列[23, 24],最低有效位分別是3和4,先對(duì)最低有效位排序后得到的結(jié)果是[23, 24],最后我們對(duì)最高有效位進(jìn)行排序,最高有效位都是是2,如果排序算法是不穩(wěn)定的那么得到的結(jié)果是[24, 23],這是不正確的。而采用穩(wěn)定排序算法輸出結(jié)果是[23, 24]。為了方便理解基數(shù)排序算法,我們作了如下圖描述基數(shù)排序過(guò)程。

從圖中可以看出,輸入序列中每個(gè)元素的數(shù)據(jù)位數(shù)不同,那么在進(jìn)行排序時(shí)高位不足的補(bǔ)0。
02

基數(shù)排序算法實(shí)現(xiàn)

基數(shù)排序算法的實(shí)現(xiàn)最重要的是各個(gè)有效位使用的排序算法,已知計(jì)數(shù)排序算法的時(shí)間復(fù)雜度是O(n k),如果基數(shù)排序采用計(jì)數(shù)排序?qū)個(gè)d位的數(shù)字進(jìn)行排序,那么時(shí)間復(fù)雜度是O(d(n k)),現(xiàn)在我們用計(jì)數(shù)排序算法實(shí)現(xiàn)基數(shù)排序算法。


//求取最大值
static?int?get_max(int?*arr, int?length){
????int?i = 0;
????int?max = 0;

????max = arr[0];
????for(i = 1; i < length; i ){
????????if(arr[i] > max){
????????????max = arr[i];
????????}
????}
????return?max;
}

//計(jì)數(shù)排序
void?count_sort(int?*arr, int?length, int?exp){
????if(arr == NULL?|| length <= 0?|| exp?<= 0){
????????return;
????}

????int?bucket[10] = {0};
????int?*output = (int?*)malloc(sizeof(int) * length);
????if(output == NULL){
????????return;
????}
????memset(output, 0, sizeof(int) * length);
????int?i = 0;
????for(i = 0; i < length; i ){
????????bucket[(arr[i] / exp) % 10] ;
????}
????for(i = 1; i < length; i ){
????????bucket[i] = bucket[i - 1];
????}
????for(i = length - 1; i >= 0; i--){
????????output[bucket[(arr[i] / exp) % 10] - 1] = arr[i];
????????bucket[(arr[i] / exp) % 10]--;
????}
????for(i = 0; i < length; i ){
????????arr[i] = output[i];
????}
????free(output);
}

//基數(shù)排序
void?radix_sort(int?*arr, int?length){
????if(arr == NULL?|| length <= 0){
????????return;
????}

????int?exp?= 0;
????int?max = get_max(arr, length);
????for(exp?= 1; max / exp; exp?*= 10){
????????count_sort(arr, length, exp);
????}
}

最后寫(xiě)一個(gè)小程序驗(yàn)證算法的正確性。


#include?
#include?"radix_sort.h"

int?main()?{
????int?arr[10] = {873, 12, 89, 256, 978, 67, 56434, 654, 24345, 9};

????radix_sort(arr, 10);
????int?i = 0;
????printf("基數(shù)排序結(jié)果\n");
????for(i = 0; i < 10; i ){
????????printf("%d ", arr[i]);
????}
????printf("\n");

????return?0;
}

編譯運(yùn)行輸出如下:


基數(shù)排序結(jié)果
9 12 67 89 256 654 873 978 24345 56434

輸出完全正確。


版權(quán)申明:內(nèi)容來(lái)源網(wǎng)絡(luò),版權(quán)歸原創(chuàng)者所有。除非無(wú)法確認(rèn),都會(huì)標(biāo)明作者及出處,如有侵權(quán)煩請(qǐng)告知,我們會(huì)立即刪除并致歉。謝謝!


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉
關(guān)閉