我试图使用byte pointers
对数组进行排序。这样,我的意思是我不想知道数组的给定类型。没有模板的泛型排序。
到目前为止,我的算法(冒泡排序)似乎只能对整数数组进行排序。但是,我无法弄清楚为什么相同的算法不会对char或float数组进行排序。我从我用解决方案编写的旧帖子中获取了我的算法:http://ideone.com/UagOGp并将其更改为使用字节。
任何想法我做错了什么?
#include <iostream>
template<typename T>
void Print(T* arr, std::size_t size)
{
std::cout<<"[";
for (std::size_t i = 0; i < size - 1; ++i)
{
std::cout<<arr[i]<<" ";
}
std::cout<<arr[size - 1]<<"]\n";
}
void PtrSwap(std::uint8_t* a, std::uint8_t* b, std::size_t size_ptr)
{
std::uint8_t t = 0;
for (int i = 0; i < size_ptr; ++i)
{
t = a[i];
a[i] = b[i];
b[i] = t;
}
}
void PtrSort(std::uint8_t* list, std::size_t length, std::size_t size_ptr, bool (*comparator)(void* a, void* b))
{
int size = length * size_ptr;
for (std::size_t i = 0; i < size; i += size_ptr)
{
for (std::size_t j = 0; j < size - i - size_ptr; j += size_ptr)
{
if (comparator(&list[j + size_ptr], &list[j]))
{
PtrSwap(&list[j + size_ptr], &list[j], size_ptr);
}
}
}
}
bool IntComparator(void* a, void* b)
{
return *static_cast<int*>(a) < *static_cast<int*>(b);
}
bool CharComparator(void* a, void* b)
{
return *static_cast<char*>(a) < *static_cast<char*>(b);
}
bool FloatComparator(void* a, void* b)
{
return *static_cast<float*>(a) < *static_cast<float*>(b);
}
int main()
{
int arr[] = {1, 3, 9, 7, 2, 4, 10, 6, 5, 8};
PtrSort((std::uint8_t*)&arr[0], 10, sizeof(int), &IntComparator);
Print(arr, 10);
char arr2[] = {'a', 'j', 'c', 'i', 'h', 'g', 'd', 'e', 'b', 'f'};
PtrSort((std::uint8_t*)&arr2[0], 10, sizeof(char), &CharComparator);
Print(arr2, 10);
float arr3[] = {1.0, 1.3, 1.9, 1.7, 1.2, 1.4, 1.1, 1.6, 1.5, 1.8};
PtrSort((std::uint8_t*)&arr3[0], 10, sizeof(float), &FloatComparator);
Print(arr3, 10);
}
编辑:已解决 ..以上代码可以使用。