在学习闲暇时间,将内容过程较好的内容段备份一次,下面内容是关于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;
} 复制代码