我目前的工作是在地方通用快速排序。
我从一个int数组开始,它是随机生成的,用于执行一些测试。
quiksort的规范是:
quicksort(void *array,int numberElem,int size, cmp(void*,void*))
cmp一个比较函数。
所以:我在main中调用函数,如下所示:
int main(void){
int myArray= .....randomly;
quicksort((void *)myArray,100,sizeof(int),cmp)
}
然后在我的快速排序中:
quicksort(void *array,int numberElem,int size, cmp(void*,void*)){
char *lArray;
lArray= (char*)array;
}
现在的问题是:
如何使用lArray比较我的字符大小的2个单元格(真正的int单元格)?
我已经做了一些研究,但没有找到答案。谢谢你的准备,如果我的英语不太好,我很抱歉。
发布于 2019-03-20 02:06:51
实现这一点的方法是将大小乘以要访问的元素的索引(注意插入排序中的Param1
和Param2
)。我花时间用插入排序而不是快速排序编写了一个相当长的示例:类型泛型背后的一般结构是相同的,但显然您必须应用快速排序而不是选择排序。
#include <stdlib.h>
#include <stdio.h>
int CmpChar(void* Param1, void* Param2) {
char P1 = *((char*) Param1);
char P2 = *((char*) Param2);
return P1 < P2;
}
int CmpShort(void* Param1, void* Param2) {
short P1 = *((short*) Param1);
short P2 = *((short*) Param2);
return P1 < P2;
}
int CmpInt(void* Param1, void* Param2) {
int P1 = *((int*) Param1);
int P2 = *((int*) Param2);
return P1 < P2;
}
int CmpLong(void* Param1, void* Param2) {
long long P1 = *((long long*) Param1);
long long P2 = *((long long*) Param2);
return P1 < P2;
}
void GenericInsertionSort(void* Array, int Length, int Size, int Cmp(void*, void*)) {
char* lArray = (char*) Array;
void* Temp = malloc(Size);
for (int i = 0; i < (Length - 1); i++) {
int j = i + 1;
void* Param1 = lArray + Size*j;
void* Param2 = lArray + Size*(j - 1);
while (j && Cmp(Param1, Param2)) {
memcpy(Temp, Param2, Size);
memcpy(Param2, Param1, Size);
memcpy(Param1, Temp, Size);
j--;
Param1 = ((char*) Param1 - Size);
Param2 = ((char*) Param2 - Size);
}
}
}
int main(void) {
long long A1[] = {5, 3, 1, 4, 2};
int A2[] = {5, 3, 1, 4, 2};
short A3[] = {5, 3, 1, 4, 2};
char A4[] = {5, 3, 1, 4, 2};
GenericInsertionSort(A1, 5, 8, CmpLong);
GenericInsertionSort(A2, 5, 4, CmpInt);
GenericInsertionSort(A3, 5, 2, CmpShort);
GenericInsertionSort(A4, 5, 1, CmpChar);
for (int i = 0; i < 5; i++) {
printf("%llu == %d == %d == %d\n", A1[i], A2[i], A3[i], A4[i]);
}
getchar();
return 0;
}
发布于 2019-03-20 01:00:18
Quic sort使用指向要比较的元素的指针调用compare函数。在你的比较函数cmp
(或者任何你想要使用的名字)中,你首先将这些空指针转换为它们所指向的类型,在你的例子中是int
。然后对它们进行比较:
int cmp(void* x1,void* x2)
{
int *v1= (int *)x1, *v2= (int *)x2;
return (*v1<*v2);
}
或
int cmp(void* x1,void* x2)
{
return (*((int *)x1) < *((int *)x2));
}
发布于 2019-03-20 01:06:51
我没有想过要根据类型更改比较函数来比较我的元素,但因此在快速排序上转换我的void数组的类型是什么?例如:
quicksort(void *array,int numberElem,int size, cmp(void*,void*)){
**HERE** *lArray;
lArray= (**HERE***)array;
}
https://stackoverflow.com/questions/55246171
复制相似问题