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...