2017-09-26 19 views
1

快速排序功能的通用QUICKSORT这需要比较器来比较不同类型的数据类型的用户定义在C

我doubts-

- >可以我们通过字符整数或阵列的阵列为void *

- >如果是....我应该怎么键入突入我的快速排序功能

#include<stdio.h> 
#include<stdlib.h> 



int compareInt(void * a, void *b) { 


    if (*(int*)a > *(int*)b) 

     return 1; 

    else if (*(int*)a < *(int*)b) 
     return -1; 

    return 0; 

} 

int compareFloat(void * a, void *b) { 

    if (*(float*)a > *(float*)b) 

     return 1; 

    else if (*(float*)a < *(float*)b) 
     return -1; 


    return 0; 
} 

int compareChar(void * a, void *b) { 

    if (*(char*)a >*(char*)b) 

     return 1; 

    else if (*(char*)a < *(char*)b) 
     return -1; 

    return 0; 
} 



void quickSort(void** A, int left, int right,int (*compare)(void*,void*)) { 

    void* temp; 

    if (right <= left) 
     return; 

    if (compare(A[right],A[left]) < 0) { 

    temp = A[right]; 
    A[right] = A[left]; 
    A[left] = temp; 
} 

int pLow = left + 1; 
int pHigh = right - 1; 
int i = left + 1; 

while (i <= pHigh) { 

    if (compare(A[i],A[left]) < 0) { 

     temp = A[i]; 
     A[i++] = A[pLow]; 
     A[pLow++] = temp; 
    } 
    else if (compare(A[right],A[i]) < 0) { 
     temp = A[i]; 
     A[i] = A[pHigh]; 
     A[pHigh--] = temp; 
    } 
    else i++; 
} 

temp = A[left]; 
A[left] = A[--pLow]; 
A[pLow] = temp; 

temp = A[right]; 
A[right] = A[++pHigh]; 
A[pHigh] = temp; 

quickSort(A, left, pLow - 1,compare); 

if (compare(A[pLow],A[pHigh]) < 0) 
    quickSort(A, pLow + 1, pHigh - 1,compare); 

quickSort(A, pHigh + 1, right,compare); 
} 

主要功能 - 前投中那些主要功能 没有转换为void **;我可以通过它作为void *吗?

int main(void){ 


    int arr1[12] = { 2, 1, 2, 23, 13, 3, 92, 3, 54, 65, 7, 7 }; 

    void** arr = (void **)malloc(sizeof(void *) * 12); 
    int i = 0; 

    for (i = 0; i<12; i++){ 
     arr[i] = (void *)&arr1[i]; 
     printf("\n%d",arr[i]); 
    } 

    //int (*compare)(void*,void*) = &compareFloat; 

    quickSort(arr, 0,11,&compareInt); 


    printf("\n%d",*(int *)arr1[3]); 

    } 
+0

你可以传递整数数组'无效*'。这就是为什么'void *'存在的原因。但是,你为什么不把'arr1'传递给'quicksort'函数呢? – tilz0R

+0

如果我这样做....我需要一个临时变量(无效*温度)交换数据....然后我该如何处理(我不能有一个变量作为无效临时) –

+0

int temp '? – tilz0R

回答

2

型号的quickSort的API后qsort

void qsort(
    void* A 
, size_t count 
, size_t size 
, int (*compare)(const void*,const void*) 
); 

你的API缺少的是size参数,它告诉你有多大的内存表示数组的单个元素块。这就是为什么你添加一个不必要的星号到void*的错误,使得A一个void**

您必须解决两个问题void*工作时 - 让i个元素的位置,并交换元素ij。这里是你如何做到这一点:

// Get A[i] 
void *ptrAi = ((char*)A)+(i*size); // Need a cast and a multiplication 

// Swap A[i] and A[j] 
char tmp[size]; // Make a temporary array 
memcpy(tmp, ptrAi, size);   // tmp = A[i] 
void *ptrAj = ((char*)A)+(j*size); 
memcpy(ptrAi, ptrAj, size);  // A[i] = A[j] 
memcpy(ptrAj, tmp, size);   // A[j] = tmp 

现在你可以修改你的函数与void*使用上述技术。这将让你通过int[]float[]char[]类型的数组没有铸造:

quickSort(arr, 0, 11, sizeof(int), &compareInt);