2017-09-26 21 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);