Быстрая сортировка - C (СИ) (247974)

Узнай цену своей работы

Формулировка задачи:

Есть программа написанная на си. Она генерирует массив и проводит на нём быструю сортировку в пределах заданного диапазона.
#include <stdio.h>//подключение библиотек
#include <stdlib.h>
#include <time.h>
#define MAX_ARR_SIZE    1024//обозначение MAX_ARR_SIZE как 1024

void swap(char *x, char *y)//функция обмена элементов местами
{
    char z = *x;
    *x = *y;//Разыменование указателей
    *y = z;
}
 
void gen_random_uniq( int arr_size, int *arr, int range_min, int range_max );//инициализация функции генерации массива
int  partition(char *A[],int lo,int hi)//Тело функции сортировки
{
        int  pivot,t,i,j;//объявление переменной
        pivot=*A[lo];//выбор элемента для сравнения
        i=lo;//левая  граница
        j=hi;//правая граница
        while(*A[hi]>=pivot)//сдвиг границы слева
               i++;
        while(*A[j]>pivot)//сдвиг границы справа
                j--;
        if (i>=j)//если границу двигать некуда, то возращается позиция
                return j;
    swap(&A[i],&A[j]);//элементы меняются местами
}

void  quicksort(char *A[], int lo, int  hi)//Функция рекурсивного вызова сортировки
{
    int p;
    if (lo<hi)//пока границы не сомкнутся
        p=partition(&A,lo,hi);//Вызов функции сортировки
    quicksort(&A,lo,p+1); // Место краша
    quicksort(&A,p-1,hi); //Аналогично вышенаписанному
}
int main(int argc, char *argv[] )//вводится размер массива  и его диапазон в формате "a i j" где a-размер, i-минимальное значение элемента массива, а j-это минимальное значение элемента массива
{
    int i, arr_size;//размер массива
    int arr[MAX_ARR_SIZE];//инициализация массива
    int range_min, range_max;//диапазон рандомных значения, которые могут принимать  элементы массива

    srand( time( NULL ) );
 
    if ( argc!=1+3 ) //Вывод справки о вводе
    {
            fprintf( stderr, "Usage: gen_random_uniq arr_size range_min range_max\n" ); exit( 1 );
    }
    arr_size= atoi( argv[1] );
    range_min= atoi( argv[2] );
    range_max= atoi( argv[3] );
    if ( arr_size<0 || arr_size>MAX_ARR_SIZE ) //проверка на корректность размера массива
    {
            fprintf( stderr, "Invalid array size\n" ); exit( 1 );
    }
    gen_random_uniq( arr_size, arr, range_min, range_max );//вызов функции генерации массива
 
    printf( "random unique array: array size is %d, range is [%d;%d]\n",// вывод сгенерированных значений элементов массива и его размера 
        arr_size, range_min, range_max
    );
    for ( i= 0; i<arr_size; i++ ) 
    {
            printf( " %d", arr[i] );
    }
    printf( "\n" );
    quicksort(&arr,3,argv[1]-3);
    //Вывод массива после быстрой сортировки
    for ( i=0; i<arr_size; i++ )
    {
        printf( " %d", arr[i]);
    }
    printf("\n");
    getchar();
    getchar();
 
    return 0;
 
} /* main() */
 
/* ================================================================ */
void gen_random_uniq( int arr_size, int *parr, int range_min, int range_max ) //тело функции генерации массива
{
 
    int i, j;//инициализация переменных
    int dup_flag;
    int rand_val, range_width= range_max-range_min+1;

    if ( range_width<1 || arr_size<0 || arr_size>range_width )//проверка на корректность данных 
    {
            fprintf( stderr, "gen_random_uniq(): Invalid arguments\n" ); exit( 1 );//предупреждение о некорректном вводе
    }
 
    for ( i= 0; i<arr_size; i++ ) 
    {
            for ( ; ; ) //Бесконечный цикл
        {
            rand_val= range_min+rand()%range_width;//Задание рандомного значения
            dup_flag= 0; //обнуление  флага
            for ( j= 0; j<i; j++ ) 
        {
                    if ( rand_val == parr[j] ) //проверка задано ли рандомное значение
            { 
                dup_flag= 1; //установка флага
                break; //выход из цикла
            }
            }
            if ( !dup_flag ) //Проверка на установку флага
        {    
            break; //Если неустановлен, то следует выход из цикла
        }
            }
        parr[i]= rand_val;//Присваивание  элементу массива рандомного значения
    }
    
} /* gen_random_uniq() */
ПРоблема в том что она крашится, после вывода сгенерированного массива. Я нашёл что краш происходит после вызова функции quicksort рекурсивно. Также есть предупреждения при компиляции.
$ gcc -o main main.c
main.c: In function ‘partition’:
main.c:27:7: warning: passing argument 1 of ‘swap’ from incompatible pointer type [-Wincompatible-pointer-types]
  swap(&A[i],&A[j]);//элементы меняются местами
       ^
main.c:7:6: note: expected ‘char *’ but argument is of type ‘char **’
 void swap(char *x, char *y)//функция обмена элементов местами
      ^~~~
main.c:27:13: warning: passing argument 2 of ‘swap’ from incompatible pointer type [-Wincompatible-pointer-types]
  swap(&A[i],&A[j]);//элементы меняются местами
             ^
main.c:7:6: note: expected ‘char *’ but argument is of type ‘char **’
 void swap(char *x, char *y)//функция обмена элементов местами
      ^~~~
main.c: In function ‘quicksort’:
main.c:35:15: warning: passing argument 1 of ‘partition’ from incompatible pointer type [-Wincompatible-pointer-types]
   p=partition(&A,lo,hi);//Вызов функции сортировки
               ^
main.c:15:6: note: expected ‘char **’ but argument is of type ‘char ***’
 int  partition(char *A[],int lo,int hi)//Тело функции сортировки
      ^~~~~~~~~
main.c:36:12: warning: passing argument 1 of ‘quicksort’ from incompatible pointer type [-Wincompatible-pointer-types]
  quicksort(&A,lo,p+1); // Место краша
            ^
main.c:31:7: note: expected ‘char **’ but argument is of type ‘char ***’
 void  quicksort(char *A[], int lo, int  hi)//Функция рекурсивного вызова сортировки
       ^~~~~~~~~
main.c:37:12: warning: passing argument 1 of ‘quicksort’ from incompatible pointer type [-Wincompatible-pointer-types]
  quicksort(&A,p-1,hi); //Аналогично вышенаписанному
            ^
main.c:31:7: note: expected ‘char **’ but argument is of type ‘char ***’
 void  quicksort(char *A[], int lo, int  hi)//Функция рекурсивного вызова сортировки
       ^~~~~~~~~
main.c: In function ‘main’:
main.c:69:12: warning: passing argument 1 of ‘quicksort’ from incompatible pointer type [-Wincompatible-pointer-types]
  quicksort(&arr,3,argv[1]-3);
            ^
main.c:31:7: note: expected ‘char **’ but argument is of type ‘int (*)[1024]’
 void  quicksort(char *A[], int lo, int  hi)//Функция рекурсивного вызова сортировки
       ^~~~~~~~~
main.c:69:19: warning: passing argument 3 of ‘quicksort’ makes integer from pointer without a cast [-Wint-conversion]
  quicksort(&arr,3,argv[1]-3);
                   ^~~~
main.c:31:7: note: expected ‘int’ but argument is of type ‘char *’
 void  quicksort(char *A[], int lo, int  hi)//Функция рекурсивного вызова сортировки
Что мне гуглить, подскажите пожалуйста? Указатели в программе я вроде верно использовал.

Решение задачи: «Быстрая сортировка»

textual
Листинг программы
char str[];
char* str;

Объяснение кода листинга программы

  1. Объявлена переменная типа char с именем str и размером в одной переменной.
  2. В качестве значения указателя переменной str присваивается адрес первой ячейки массива.
  3. В теле программы происходит использование переменной str как указателя на массив символов.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.909 из 5