簡體   English   中英

我在 C 中編寫了這個合並排序程序。 執行 arrays 后顯示“分段錯誤(核心轉儲)”

[英]I have written this Merge Sort program in C. It shows "Segmentation fault (core dumped)" after implementation of arrays

#include <stdio.h>

void mergesort();
void merge();

int main()
{
    int a[40], n;
    printf("\nEnter the number of elements:");
    scanf("%d", &n);
    printf("\nEnter the %d elements:", n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    mergesort(a, 0, n - 1);
    printf("\nThe Sorted array is: ");
    for (int i = 0; i < n; i++)
    {
        printf("%d ", a[i]);
    }
    return 0;
}

void mergesort(int a[], int first, int last)
{
    int mid;
    if (first < last)
    {
        mid = (mid + last) / 2;
        mergesort(a, first, mid);
        mergesort(a, mid + 1, last);
        merge(a, first, mid, last);
    }
}

void merge(int a[], int first, int mid, int last)
{
    int b[50];
    int i, j, k;
    i = first;
    j = mid + 1;
    k = first;
    while (i <= mid && j <= last)
    {
        if (a[i] <= a[j])
            b[k++] = a[i++];
        else
            b[k++] = a[j++];
    }
    if (i > mid)
    {
        while (j <= last)
            b[k++] = a[j++];
    }
    else
    {
        while (i <= mid)
            b[k++] = a[i++];
    }
    for (i = first; i <= last; i++)
        a[i] = b[i];
}

我在 C 中編寫了這個合並排序程序。 執行 arrays 后顯示“分段錯誤(核心轉儲)”。 我不知道是什么問題。 所以請幫幫我,我第二天要考試。 我像這樣得到 output

輸入元素數:5

輸入 5 個元素:1 2 3 5 4 分段錯誤(核心轉儲)

發現我在實現中間變量時出錯了。 正確的是:

mid=(first+last)/2;

謝謝大家的幫助。 您的每一條回復都有助於識別錯誤。

該程序具有未定義的行為,因為您在未初始化時閱讀了mid

void mergesort(int a[], int first, int last) {
    int mid;
    if (first < last) {
        mid = (mid + last) / 2;
//             ^^^

你可能想要:

        mid = (first + last) / 2;
void mergesort(int a[],int first,int last)
{
 int mid;
 if(first<last)
 {
  mid=(mid+last)/2;
  mergesort(a,first,mid);
  mergesort(a,mid+1,last);
  merge(a,first,mid,last);
 }
}

第一次運行時,不保證mid為 0 或任何其他數字; mid 是一些 integer,每次都可能改變。 因此,您獲得的數字可能遠遠超出數組的范圍。 將 mid 初始化為 0 可以解決這個問題,但正如我上面的答案指出的那樣,你實際上想要做mid = (first + last) / 2

暫無
暫無

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

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