演算法導論8 3 a 習題解答 基數排序

2021-09-06 02:51:13 字數 3104 閱讀 7753

clrs 8-3(a) :給定乙個整數陣列,其中不同的整數中包含的數字個數可能不同,但該陣列中,所有整數中總的數字數為n。說明如何在o(n)時間內對該陣列進行排序。

演算法思想:

1)先把各個數字按位數分組。

2)然後對各個分數進行基數排序

3)將各個組連線起來即可

這個題目基本上重複了演算法導論8.3-4習題解答(基數排序) 的核心演算法.

#include

<

iostream

>

#include

<

fstream

>

using 

namespace

std;

void

radix_sort(

int*

a, const

intd,

const

intlength,

intradix);

intgetbit(

intm,

inti,

intradix);

intpow2(

inta,

intb);

intmain()

//一位數、二位數、三位數、四位數的個數

intone = 0

; int

ten = 0

; int

hundred = 0

; int

thousand = 0

; int

ten_thousand = 0

;//儲存一位數、二位數、三位數、四位數相應的陣列

int*

one_arr

= new 

int[len];

int*

ten_arr

=new 

int[len];

int*

hundred_arr

=new 

int[len];

int*

thounsand_arr

=new 

int[len];

int*

ten_thousand_arr

=new 

int[len];

for(

inti =0

; i

<

len; i++)

radix_sort(one_arr,

1, one,

10);

radix_sort(ten_arr,

2, ten,

10);

radix_sort(hundred_arr,

3, hundred,

10);

radix_sort(thounsand_arr,

4, thousand,

10);

radix_sort(ten_thousand_arr,

5, ten_thousand,

10);

intone_to_ten

=one

+ten;

intone_to_hundred

=one

+ten

+hundred;

intone_to_thousand

=one

+ten

+hundred

+thousand;

intone_to_ten_thousand

=one

+ten

+hundred

+thousand

+ten_thousand;

for(

inti =0

; i

<

len; i++)

const 

char

*file_name = "

8-3(a).txt";

ofstream out_to_file;

out_to_file.open(file_name);

for(

inti =0

; i

<

len; i++)

out_to_file

<<

a[i]

<<

endl;

out_to_file.close();

delete one_arr;

delete ten_arr;

delete hundred_arr;

delete thounsand_arr;

delete ten_thousand_arr;

return 0;

}void

radix_sort(

int*

a, const

intd,

const

intlength,

intradix)

for(

intk =1

; k

<

radix; k++)

c[k]

=c[k]

+c[k -1

];for

(intk =

length -1

; k

>=

0; k--)

for(

intk =0

; k

<

radix; k++)

c[k] =0

;for

(inti =

0; i

<

length; i++)

a[i]

=b[i];

}delete remainder;

delete c;

delete b;}//

得到相應位上的數值

intgetbit(

intm,

inti,

intradix)

//只處理指數b>=0

intpow2(

inta,

intb)

else 

if(b ==0

)return 1;

else}

演算法導論CLRS 8 3 基數排序

8.3 基數排序 radix sort include include include includeusing namespace std typedef vector iterator tvecite typedef vector iterator tvecpite void radixsort...

演算法導論 基數排序

時間複雜度 o n 基本思路 兩個數比較大小,我們的直觀感覺是先比較高位,若相同則比較低位。但是這樣做需要記錄額外的資料,浪費空間。而基數排序則是先比較低位,再比較高位。通過各個位的比較進行排序,如果陣列元素最大有n位,則總共需要n次排序。注意 按位排序必須是穩定排序,所以在這我選擇了計數排序。具體...

演算法導論8 2 4習題解答 計數排序

clrs 8.2 4 在o 1 的時間內,回答出輸入的整數中有多少個落在區間 a.b 內。給出的演算法的預處理時間為o n k 演算法思想 利用計數排序,由於在計數排序中有乙個儲存數值個數的臨時儲存區c 0.k 利用這個陣列即可。include iostream using namespace st...