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

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

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

Здравствуйте! Разбираюсь с быстрой сортировкой и что-то пошло не так. Компилятор ни на что не ругается, просто неправильно сортирует и я не могу разобраться почему, поможете? Здесь структура element, в которой имя, обозначение, ат. масса и т.п. информация об хим. элементе и мне нужно отсортировать все данные по имени в алфавитном порядке, а после их вывести на экран в виде таблицы. Я для этого создаю массив (чтобы файл оставить без изменений), заполняю его структурами из файла, после сортирую и вывожу.
Листинг программы
  1. void quicksort (element a[],int l,int r)
  2. {
  3. element buf, key=a[l];
  4. if (l<r)
  5. {
  6. int i=l+1, j=r;
  7. while (1)
  8. {
  9. while (i<=r && (strcmp(a[i].nameelem,key.nameelem))<0) i++;
  10. while (strcmp(a[j].nameelem,key.nameelem)>0) j--;
  11. if (i>=j) break;
  12. buf=a[i];
  13. a[i]=a[j];
  14. a[j]=buf;
  15. i++; j--;
  16. }
  17. buf=a[j];
  18. a[j]=a[l];
  19. a[l]=buf;
  20. quicksort(a,l,j-1);
  21. quicksort(a,j+1,r);
  22. }
  23. }
  24. void qsort()
  25. {
  26. element el;
  27. system ("cls");
  28. printf("\n Введите имя файла: ");
  29. char filename[80];
  30. fflush(stdin);
  31. gets(filename);
  32. FILE *f;
  33. f=fopen(filename,"rb");
  34. fseek(f,0,2);
  35. int r=ftell(f)/sizeof(element),i;
  36. element mas[r];
  37. rewind(f);
  38. for (i=0;i<r;i++)
  39. fread(&mas[i],sizeof(element),1,f);
  40. fclose(f);
  41. quicksort(mas,0,r-1);
  42. f=fopen(filename,"wb+");
  43. for (i=0;i<r;i++)
  44. fwrite(&mas[i],sizeof(element),1,f);
  45. rewind(f);
  46. printf("\n |--------------------------------------------------------------------------| \n");
  47. printf(" |Ат. н.| Наим. эл.| Хим. обозн.| н. пер.| н. гр.| Ат. масса| Распр. электр.|");
  48. printf("\n |--------------------------------------------------------------------------| ");
  49. while (fread(&el,sizeof(element),1,f))
  50. {
  51. printf("\n |%-6d| %-9s| %-11s| %-7d| %-6d| %-9.3f| %-14d|",el.atnumber,el.nameelem,el.chimicalname,el.numberper,el.numbergroup,el.atmassa,el.electrons);
  52. printf("\n |--------------------------------------------------------------------------| ");
  53. }
  54. system("Pause");
Я понял, что вывожу просто данные из файла, я заменил
Листинг программы
  1. while (fread(&el,sizeof(element),1,f))
  2. {
  3. printf("\n |%-6d| %-9s| %-11s| %-7d| %-6d| %-9.3f| %-14d|",el.atnumber,el.nameelem,el.chimicalname,el.numberper,el.numbergroup,el.atmassa,el.electrons);
  4. printf("\n |--------------------------------------------------------------------------| ");
  5. }
На
Листинг программы
  1. for (i=0;i<r;i++)
  2. {
  3. 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);
  4. printf("\n |--------------------------------------------------------------------------| ");
  5. }
Но выводит тоже самое и почему-то несколько раз...

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

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void quicksort(int a[],int l,int r)
  5. {
  6.     int buf, key=a[l];
  7.     if (l<r)
  8.     {
  9.         int i=l+1, j=r;
  10.         while (1)
  11.         {
  12.             while (i<=r && a[i] < key) i++;
  13.             while (a[j] > key) j--;
  14.             if (i>=j) break;
  15.             buf=a[i];
  16.             a[i]=a[j];
  17.             a[j]=buf;
  18.             i++; j--;
  19.         }
  20.         buf=a[j];
  21.         a[j]=a[l];
  22.         a[l]=buf;
  23.         quicksort(a,l,j-1);
  24.         quicksort(a,j+1,r);
  25.     }
  26. }
  27.  
  28. int main(int argc, const char *argv[])
  29. {
  30.     int i;
  31.     /*int a[] = {8, 6, 2, 3, 4, 9, 10, 1};*/
  32.     /*int a[] = {8, 6, 2, 3, 9};*/
  33.     int a[] = {4, 9, 7, 6, 2, 3};
  34.  
  35.     int size = sizeof(a)/sizeof(int);
  36.  
  37.     for (i = 0; i < size; i++) {
  38.         printf("%d ", a[i]);
  39.     }
  40.     printf("\n");
  41.  
  42.     quicksort(a, 0, size - 1);
  43.    
  44.     for (i = 0; i < size; i++) {
  45.         printf("%d ", a[i]);
  46.     }
  47.     printf("\n");
  48.  
  49.     exit(EXIT_SUCCESS);
  50. }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы