Быстрая сортировка работает неправильно - 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);
- }
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы: stdio.h и stdlib.h
- Определяется функция quicksort, которая реализует быструю сортировку
- В функции main создается массив a размером 5, заполненный случайными значениями от 1 до 9
- Выводится на экран содержимое массива a
- Вызывается функция quicksort для сортировки массива a в порядке возрастания
- Выводится на экран отсортированный массив a
- Программа успешно завершается
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д