我目前正在就地使用通用Quicksort。
我从一个随机生成的int数组开始做一些测试。
quiksort的规格为:
quicksort(void *array,int numberElem,int size, cmp(void*,void*))
提供比较功能。
所以: 我在主程序中调用该函数,例如:
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;
}
现在的问题是:
如何使用大小比较char lArray的2个单元格(真正的int单元格)?
我进行了一些研究,但没有找到答案。 感谢您的准备,如果我的英语不太好,抱歉。
答案 0 :(得分:3)
Quic sort使用指向要比较元素的指针来调用您的compare函数。在比较函数cmp
(或您要使用的其他名称)中,首先将这些void指针强制转换为它们指向的类型,在您的情况下为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));
}
答案 1 :(得分:0)
我没有想到要根据类型来更改比较函数以比较我的元素,但是要在quicksort上转换我的void数组的类型是什么? 例如:
quicksort(void *array,int numberElem,int size, cmp(void*,void*)){
**HERE** *lArray;
lArray= (**HERE***)array;
}
答案 2 :(得分:0)
执行此操作的方法是将大小乘以您正在访问的元素的索引(请注意插入排序中的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;
}