簡體   English   中英

C中的通用插入排序

[英]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不是指針,因此您的測試數組的類型為*intint[] 但是在您的函數中,您不知道這些,而是​​嘗試使代碼與指針一起使用。 因此,您期望* void[] 如果將temp變量更改為int ,則簽名中不需要** 同樣,如果要保留“泛型”(如您所稱),則需要一個*int數組。

基本上,在C中,您不能為主要類型和指針編寫開箱即用的函數。 您需要一些技巧。 看看這個stackoverflow ,也許會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM