Быстрая сортировка работает неправильно - C (СИ)

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

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

Здравствуйте! Разбираюсь с быстрой сортировкой и что-то пошло не так. Компилятор ни на что не ругается, просто неправильно сортирует и я не могу разобраться почему, поможете? Здесь структура element, в которой имя, обозначение, ат. масса и т.п. информация об хим. элементе и мне нужно отсортировать все данные по имени в алфавитном порядке, а после их вывести на экран в виде таблицы. Я для этого создаю массив (чтобы файл оставить без изменений), заполняю его структурами из файла, после сортирую и вывожу.
void quicksort (element a[],int l,int r)
    {
        element buf, key=a[l];
        if (l<r)
            {
                int i=l+1, j=r;
                while (1)
                    {
                        while (i<=r && (strcmp(a[i].nameelem,key.nameelem))<0) i++;
                        while (strcmp(a[j].nameelem,key.nameelem)>0) j--;
                        if (i>=j) break;
                        buf=a[i];
                        a[i]=a[j];
                        a[j]=buf;
                        i++; j--;
                    }
                buf=a[j];
                a[j]=a[l];
                a[l]=buf;
                quicksort(a,l,j-1);
                quicksort(a,j+1,r);
            }
    }
void qsort()
{
    element el;
    system ("cls"); 
    printf("\n Введите имя файла: ");
    char filename[80];
    fflush(stdin);
    gets(filename);
    FILE *f;
    f=fopen(filename,"rb");
    fseek(f,0,2);
    int r=ftell(f)/sizeof(element),i;
    element mas[r];
    rewind(f);
    for (i=0;i<r;i++)
        fread(&mas[i],sizeof(element),1,f);
    fclose(f);
    quicksort(mas,0,r-1);
    f=fopen(filename,"wb+");
    for (i=0;i<r;i++)
        fwrite(&mas[i],sizeof(element),1,f);
    rewind(f);
    printf("\n |--------------------------------------------------------------------------| \n");
    printf(" |Ат. н.| Наим. эл.| Хим. обозн.| н. пер.| н. гр.| Ат. масса| Распр. электр.|");
    printf("\n |--------------------------------------------------------------------------| ");
    while (fread(&el,sizeof(element),1,f))
    {
        printf("\n |%-6d| %-9s| %-11s| %-7d| %-6d| %-9.3f| %-14d|",el.atnumber,el.nameelem,el.chimicalname,el.numberper,el.numbergroup,el.atmassa,el.electrons);
        printf("\n |--------------------------------------------------------------------------| ");
    }   
    system("Pause");
Я понял, что вывожу просто данные из файла, я заменил
while (fread(&el,sizeof(element),1,f))
    {
        printf("\n |%-6d| %-9s| %-11s| %-7d| %-6d| %-9.3f| %-14d|",el.atnumber,el.nameelem,el.chimicalname,el.numberper,el.numbergroup,el.atmassa,el.electrons);
        printf("\n |--------------------------------------------------------------------------| ");
    }
На
for (i=0;i<r;i++)
        {
            printf("\n |%-6d| %-9s| %-11s| %-7d| %-6d| %-9.3f| %-14d|",mas[i].atnumber,mas[i].nameelem,mas[i].chimicalname,mas[i].numberper,mas[i].numbergroup,mas[i].atmassa,mas[i].electrons);
            printf("\n |--------------------------------------------------------------------------| ");         
        }
Но выводит тоже самое и почему-то несколько раз...

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

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
void quicksort(int a[],int l,int r)
{
    int buf, key=a[l];
    if (l<r)
    {
        int i=l+1, j=r;
        while (1)
        {
            while (i<=r && a[i] < key) i++;
            while (a[j] > key) j--;
            if (i>=j) break;
            buf=a[i];
            a[i]=a[j];
            a[j]=buf;
            i++; j--;
        }
        buf=a[j];
        a[j]=a[l];
        a[l]=buf;
        quicksort(a,l,j-1);
        quicksort(a,j+1,r);
    }
}
 
int main(int argc, const char *argv[])
{
    int i;
    /*int a[] = {8, 6, 2, 3, 4, 9, 10, 1};*/
    /*int a[] = {8, 6, 2, 3, 9};*/
    int a[] = {4, 9, 7, 6, 2, 3};
 
    int size = sizeof(a)/sizeof(int);
 
    for (i = 0; i < size; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");
 
    quicksort(a, 0, size - 1);
    
    for (i = 0; i < size; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");
 
    exit(EXIT_SUCCESS);
}

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

  1. Включаются необходимые заголовочные файлы: stdio.h и stdlib.h
  2. Определяется функция quicksort, которая реализует быструю сортировку
  3. В функции main создается массив a размером 5, заполненный случайными значениями от 1 до 9
  4. Выводится на экран содержимое массива a
  5. Вызывается функция quicksort для сортировки массива a в порядке возрастания
  6. Выводится на экран отсортированный массив a
  7. Программа успешно завершается

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


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

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

14   голосов , оценка 4.214 из 5
Похожие ответы