[英]user-defined generic quickSort in c
QuickSort 函數,它采用比較器來比較不同類型的數據類型
我的疑惑——
->我們可以將整數數組或字符數組作為 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]);
}
在qsort
之后對quickSort
的 API 建模:
void qsort(
void* A
, size_t count
, size_t size
, int (*compare)(const void*,const void*)
);
您的 API 缺少的是size
參數,它告訴您表示數組單個元素的內存塊有多大。 這就是為什么你犯了一個錯誤,給void*
添加了一個不必要的星號,使A
成為void**
。
使用void*
時,您必須解決兩個問題 - 獲取第i
個元素的位置,並交換元素i
和j
。 這是你如何做到的:
// 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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.