您的位置:首页 > 其它

非比较排序

2016-04-10 13:50 239 查看
非比较排序有:1.计数排序(适用于要排序的数的范围不大时) ,以数组中的数据为key值,得到它们出现的次数,

然后根据它们出现的次数进行重新排列,得到它们的有序数列。相当于哈希表的直接定址法。

2.基数排序 LSD-- Least Significant Digit first
MSD-- Most Significant Digit first , 首先根据个位的数值,在遍历数组数据时将他们 分配到0~9号的桶(个位与桶号一一对应)中,接下来将桶中按桶号由小到大一次重新收集到数组中,接着,再根据十位上的数值进行分配,重复这个过程,直到排到最大位的数据,得到有序数列。

实现代码如下:
1.计数排序:
void CountSort(int *a, size_t size)
{
assert(a);
int max = a[0];
int min = a[0];
for (int i = 0; i < size; i++)
{
if (a[i] > max)
{
max = a[i];
}
else if (a[i] < min)
{
min = a[i];
}
}
int len = max - min + 1;
int *countArr = new int[len];
memset(countArr, 0, sizeof(int)*len);
for (int i = 0; i < size; i++)
{
countArr[a[i] - min]++;
}
int tmp = 0;
for (int i = 0; i < len; i++)
{
while (countArr[i]--)
{
a[tmp++] = i + min;
}
}
}


2.基数排序:
int GetMaxDigit(int *a, size_t size)
{
int digit = 1;
int max = 10;
for (int i = 0; i < size; i++)
{
if (a[i] >= max)
{
digit++;
max *= 10;
}
}
return digit;
}

//基数排序
void LSDSort(int *a, size_t size)
{
int maxdigit = GetMaxDigit(a, size);
int *bucket = new int[size];
int count[10];
int start[10];
int bit = 1;
int digit = 1;
while (bit <= maxdigit)
{
memset(count, 0, sizeof(int)* 10);
memset(start, 0, sizeof(int)* 10);
for (int i = 0; i < size; i++)
{
int num = (a[i]/digit) % 10;
count[num]++;
}
start[0] = 0;
for (int i = 1; i < size; i++)
{
start[i] = start[i - 1] + count[i - 1];
}
for (int i = 0; i < size; i++)
{
int num = (a[i] / digit) % 10;
bucket[start[num]++] = a[i];
}
memcpy(a, bucket, sizeof(int)*size);
digit *= 10;
bit++;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: