Сортировка пузырьков в C, показывающая ошибку сегментации - PullRequest
0 голосов
/ 29 декабря 2018

Я пишу код для сортировки массива с использованием пузырьковой сортировки, но он показывает ошибку, которую я не могу устранить.код:

#include<stdio.h>

void swap();
void bubbleSort();
void printArr();

void main()
{
    int n, arr[20];
    printf("\n Enter the number of elements: ");
    scanf("%d",&n);
    printf("\n Enter the elements: ");
    for(int i = 0; i<= n-1; i++)
        scanf("%d",&arr[n]);
    bubbleSort(arr, n);
    printArr(arr, n);  
}

void swap(int *a, int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

void bubbleSort(int arr[], int size)
{
    int a, b;
    for(int i=0; i<=size-1; i++)
    {
        if(arr[a] > arr[b])
            swap(arr[a],arr[b]);

    }
 }

void printArr(int arr[], int size)
{
    int i;
    printf("\n Sorted array: ");
    for(i=0; i<=size-1; i++)
        printf(" %d ", arr[i]);
}

когда я компилирую файл, он показывает два предупреждения вроде этого:

sort.c: в функции 'bubbleSort':

sort.c: 37: 21: предупреждение: при передаче аргумента 1 'swap' указатель получается из целого числа без преобразования [-Wint-преобразование]

         swap(arr[a],arr[b]);
              ~~~^~~

sort.c: 20: 16: примечание: ожидается 'int *'но аргумент имеет тип' int '

          void swap(int *a, int *b)
                    ~~~~~^

sort.c: 37: 28: предупреждение: передача аргумента 2' swap 'делает указатель из целого числа без приведения [-Wint-преобразование]

         swap(arr[a],arr[b]);
                     ~~~^~~

sort.c: 20: 24: note: ожидаемое int *, но аргумент имеет тип int

         void swap(int *a, int *b)
                   ~~~~~^

, когда я запускаю программу, она принимает вводно после этого его показ segmentation fault (core dumped)

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 29 декабря 2018

Функция swap() принимает указатели, поэтому ее нужно вызывать как swap(&arr[a], &arr[b]);.

В противном случае она принимает значения int в качестве адресов памяти (т.е. указатели int*) и пытается получить доступих, что приводит к ошибке сегментации, потому что программа обращается за пределы допустимого диапазона адресов.

А для сортировки по пузырям необходимо многократно повторять массив, пока все пары не будут в правильномorder.

Также переменные a и b неинициализированы.Для сортировки по пузырькам необходимо сравнить и заменить i и i+1, для i с 0 до size-2.

...