如何解决在不使用动态内存分配的情况下实现存储桶排序和计数排序
我正在练习C ++中的排序算法,应该在不使用向量的情况下实现算法。因此,可以从#define ARR_SIZE 25
开始确定未排序的数组大小,并从均匀分布的随机数中选择元素。
void Sorters::InitializeArray()
{
for (int i = 0; i < ARR_SIZE; i++) {
arr[i] = uniformRandom.Randomlydistribute(LOWER_ARRAY_LIMIT,UPPER_ARRAY_LIMIT);
}
}
随机数的下限为#define LOWER_ARRAY_LIMIT 0
,上限为#define UPPER_ARRAY_LIMIT 200
。我实施了冒泡排序,这是
void Sorters::BubbleSort(int arr[],int arraySize)
{
for (int k = 0; k < arraySize; k++)
for (int i = 0; i < arraySize - k - 1; i++)
if (arr[i] > arr[i + 1]) {
temporaryVal = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temporaryVal;
}
}
但是,我在存储桶排序和计数排序方面遇到了麻烦。我如何实施它们?在存储桶排序中,由于它不是动态的,我将如何确定每个存储桶的大小?谢谢。
解决方法
桶排序:
您可以就地进行存储桶排序,因此无需分配额外的空间。只需根据二进制表示进行存储桶排序。这是伪代码:
(doseq [line (line-seq (java.io.BufferedReader. *in*))]
(println line))
基本上只按最高有效位对数组进行分区,然后按下一个最高有效位对每个分区进行排序,然后递归应用此分区,直到对整个数组进行排序为止。
计数排序:
无论如何,bucket_sort_int(arr,lower,upper,bit):
if bit == -1:
return
l,u = lower,upper
while l < u:
if ~bitmask(bit) & arr[l]:
l++
else if bitmask(bit) & arr[u]:
u--
else:
arr[l],arr[u] = arr[u],arr[l]
l++
u--
bucket_sort_int(arr,u,bit - 1)
bucket_sort_int(arr,u + 1,bit - 1)
bucket_sort(arr):
bucket_sort_int(arr,len(arr) - 1,sizeof(arr[0]) * 8 - 1)
中可能的值范围必须事先知道。因此,无论如何都不需要使用动态数组。只需使用具有预定义长度和标准算法的全局数组,就可以了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。