在學習閒暇時間,將內容過程較好的內容段備份一次,下面內容是關於C++實現的計數排序與基數排序的內容,應該是對碼農們有些用途。
using namespace std;
void display (int a[], int n);
int max (int a[], int n);
void counting_sort (int a[], int b[], int n, int k);
int main()
{
int a[100];
int b[100];
int n;
while (cin >> n)
{
for (int i = 0; i < n; i++)
cin >> a[i];
int k = max (a, n);
counting_sort (a, b, n, k);
display (b, n);
}
return 0;
}
void display (int a[], int n)
{
for (int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
}
int max (int a[], int n)
{
int m = a[0];
for (int i = 1; i < n; i++)
{
if (m < a[i])
m = a[i];
}
return m;
}
void counting_sort (int a[], int b[], int n, int k)
{
for (int i = 0; i <= k; i++)
c[i] = 0;
for (int i = 0; i < n; i++)
c[a[i]]++;
for (int i = 1; i <= k; i++)
c[i] = c[i] + c[i - 1];
{
b[c[a[i]] - 1] = a[i];
c[a[i]]--;
}
delete [] c;
} 複製代碼
對於計數排序,我認爲有一個最明顯的缺點就是須要很大的額外的空間,尤爲當待排序數組中的少數一些元素特別大的時候,會形成很大的空間浪費。好比這樣一個序列:1,2,6,8,3,0....100,65.........10000000,1000000000,那麼這時咱們的K的取值爲1000000000,這樣數組C大小就開到1000000000了,但不少咱們都不須要用到。基數排序基數排序是經過對各個元素每一個位上的數來進行排序從而實現排序的。首先必須統一全部元素的數位長度,數位較短的在前面補0.而後從最低位開始,依次對每一個位進行排序,當從最低位到最高位都排序完之後,即可獲得一個有序序列了。至於這個方法正確性的證實能夠看下算法導論。對每一個位的排序能夠採用計數排序實現,這時K直接取9便可。基數排序實現代碼以下:
using namespace std;
void display (int a[], int n);
int max (int a[], int n);
int max_bit (int num);
void radix_sort (int a[], int n);
int main()
{
int a[100];
int b[100];
int n;
while (cin >> n)
{
for (int i = 0; i < n; i++)
cin >> a[i];
radix_sort (a, n);
display (a, n);
}
return 0;
}
void display (int a[], int n)
{
for (int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
}
int max (int a[], int n)
{
int m = a[0];
for (int i = 1; i < n; i++)
{
if (m < a[i])
m = a[i];
}
return m;
}
int max_bit (int num)
{
int bits = 1;
while (num / 10)
{
bits++;
num /= 10;
}
return bits;
}
void radix_sort (int a[], int n)
{
int c[10];
int radix = 1;
int t;
int d;
d = max_bit (max (a, n));
{
for (int j = 0; j < 10; j++)
c[j] = 0;
for (int j = 0; j < n; j++)
{
t = a[j] / radix % 10;
c[t]++;
}
for (int j = 1; j < 10; j++)
c[j] += c[j - 1];
for (int j = n - 1; j >= 0; j--)
{
t = a[j] / radix % 10;
b[c[t] - 1] = a[j];
c[t]--;
}
for (int j = 0; j < n; j++)
a[j] = b[j];
}
delete [] b;
} 複製代碼