[英]Generic insertion sort in C
我已經用C編寫了一個通用的插入排序代碼,它的工作真的很好。
但是,在我的插入排序功能上,它得到一個void** arr
,在其簽名上它得到一個void* arr
,否則它將不起作用。
為什么會這樣呢? 我們還有其他方法可以將插入排序編碼為通用嗎?
完整代碼在這里:
#include <stdio.h>
#include <malloc.h>
#define SIZE 10
int cmp(void* elm1, void* elm2);
void insertionSort(void* arr, int size);
int main()
{
int arr[] = {5, 8, 2, 3, 15, 7, 4, 9, 20, 13};
int arr2[] = {1};
int i;
for (i = 0; i < SIZE; i++)
printf("%d ", arr[i]);
printf("\n");
insertionSort(&arr, SIZE);
for (i = 0; i < SIZE; i++)
printf("%d ", arr[i]);
return 0;
}
void insertionSort(void** arr, int size)
{
int i = 1;
int j;
void* temp;
while (i < size)
{
if (cmp(arr[i], arr[i-1]) == -1)
{
temp = arr[i];
j = i - 1;
while (j >= 0 && cmp(arr[j], temp) == 1)
{
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = temp;
}
i++;
}
}
int cmp(void* elm1, void* elm2)
{
if ((int)elm1 == (int)elm2)
return 0;
else if ((int)elm1 > (int)elm2)
return 1;
else
return -1;
}
由於存在多個問題,因此未定義代碼。 它恰好起作用,因為在您的系統上,指針的大小與int
類型的大小相同。
沒有警告(如果啟用警告),代碼將不會編譯。 函數insertSort及其原型必須具有相同的類型。
您應該將函數定義中的類型更改為
void insertionSort(void* arr, int size)
然后將指針arr轉換為適當的類型。 由於這是通用排序,如qsort(),因此唯一可行的選擇是強制轉換為char*
。 這意味着您還必須將類型的大小傳遞給函數,以便可以正確增加指針。 這將要求您徹底更改功能。
因此,函數原型實際上應該與qsort相同:
void Sort(void* arr, size_t size , size_t object_size , int(*)( const void* , const void* ))
問題在於integers
不是指針,因此您的測試數組的類型為*int
或int[]
。 但是在您的函數中,您不知道這些,而是嘗試使代碼與指針一起使用。 因此,您期望* void[]
。 如果將temp
變量更改為int
,則簽名中不需要**
。 同樣,如果要保留“泛型”(如您所稱),則需要一個*int
數組。
基本上,在C中,您不能為主要類型和指針編寫開箱即用的函數。 您需要一些技巧。 看看這個stackoverflow ,也許會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.