使用字节指针对数组类型进行排序和交换

时间:2014-03-25 00:22:57

标签: c++ arrays algorithm sorting

我试图使用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);
}

编辑:已解决 ..以上代码可以使用。

0 个答案:

没有答案