【发布时间】:2020-02-07 01:31:40
【问题描述】:
我编写了一个通用版本的插入排序算法。它适用于 int 和 char,但它不能对浮点数进行排序。我想不通。它是否必须与内存中浮点数的表示或其他什么有关?
这是我的代码:
void insertion_sort(void *array, int elemSize, int arrSize){
for(int i = 0;i < arrSize;i++){
for(int j = 1;j < arrSize;j++){
void *elem1 = (char *) array + ((j-1) * elemSize);
void *elem2 = (char *) array + (j * elemSize);
if(memcmp(elem2,elem1,elemSize) < 0){
void *temp = malloc(sizeof(elemSize));
memcpy(temp,elem1,elemSize);
memcpy(elem1,elem2,elemSize);
memcpy(elem2,temp,elemSize);
free(temp);
}
}
}
}
Sample output of insertion sort:
char:-)
Unsorted : e d a c b
Sorted : a b c d e
int:-)
Unsorted : 4 5 2 3 1
Sorted : 1 2 3 4 5
float:-(
Unsorted : 3.3 1.2 44.5 5.1 2.8
Sorted : 44.5 2.8 3.3 5.1 1.2
编辑: 此代码也不适用于 int 或 char。看看我在这里写的另一个版本[链接]:https://bitbucket.org/Kessinger/c-generics/src/master/generic_insertion_sort.c
【问题讨论】:
-
考虑在 for 循环之外预分配
temp,如果你有一些有效的大小,同样删除。还需要一个int (*compareFcn)(const void*, const void*)形式的自定义比较器来对 any 数据类型进行排序。 -
memcmp一次比较一个字节,并在第一个差异处停止。因此,此代码仅适用于 big-endian system 上的int类型。对于int测试,尝试 400,500,200,300,100 以查看您的系统是否为大端。大多数系统都不是。 -
@user3386109 我的系统是 little endian,所以我可以对 int 进行排序
-
你试过未排序的值 400,500,200,300,100 吗?
-
查看标准C
qsort()函数。它接受一个比较器函数指针参数,以便您可以适当地比较值(包括按升序或降序排序)。您需要做同样的事情才能从您的通用排序中获得合理的结果。比较器函数参数不是偶然的,也不是因为人们想让生活变得困难的标准;它可以使通用qsort()正常工作。
标签: c