Сравнить количество перестановок при сортировке массива методами Шелла и челночным - C (СИ)

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

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

Дан массив из 10000 элементов. Нужно провести сортировку шелла по убыванию, а так же челночную сортировку, а затем сравнить эти методы по числу сравнений и перестановок элементов, вывести эти значения и отсортированный массив в файл.
Пока имеется только вот это:
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <math.h>
  5. #include <time.h>
  6. void vvod_m(int n, int a[])
  7. {
  8. int i;
  9. srand(time(0));
  10. for(i=0;i<n;i++)
  11. {
  12. a[i]=rand()%n;
  13. }
  14. }
  15. void vyvod(int n, int a[])
  16. {
  17. int i;
  18. FILE*h;
  19. h=fopen("out.txt", "w");
  20. for(i=0;i<n;i++)
  21. {
  22. fprintf(h,"%d \n", a[i]);
  23. }
  24. fclose(h);
  25. }
  26. int ShellSort(int a[],int len)
  27. {
  28. long d=len,i,j;
  29. int c;
  30. do
  31. {
  32. d=d/2;
  33. i=0;
  34. while ((j=i+d)<len)
  35. {
  36. if (a[i]>a[j])
  37. {
  38. c=a[i];
  39. a[i]=a[j];
  40. a[j]=c;
  41. };
  42. i++;
  43. };
  44. }
  45. while (d>1);
  46. return 0;
  47. }
  48. int main()
  49. {
  50. int a[10000], n ;
  51. do
  52. {
  53. printf ("Vvedite n \n");
  54. scanf ("%d", &n);
  55. }
  56. while ((n<=0)||(n>10000));
  57. vvod_m(n,a);
  58. ShellSort(a,10000);
  59. vyvod(n,a);
  60. return 0;
  61. }

Решение задачи: «Сравнить количество перестановок при сортировке массива методами Шелла и челночным»

textual
Листинг программы
  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. #include <locale.h>
  5.  
  6. using namespace std;
  7.  
  8. void shsort(int *pn, int n, ofstream& f);
  9. void dsort(int* pn, int n, ofstream& f);
  10. void swap(int& n1, int& n2);
  11.  
  12. using namespace std;
  13.  
  14. int main()
  15. {
  16.     setlocale(LC_ALL,"Russian");
  17.  
  18.     const char* filename = "d:\\output.txt";
  19.     ofstream ofs(filename,ofstream::out);
  20.  
  21.     int n = 0;
  22.     cout << "Введите количество элементов массива N = "; cin>>n;
  23.  
  24.     int i = 0, *A = new int[n];
  25.     while (i < n) A[i++] = i + 1;
  26.  
  27.     shsort(A,n,ofs);        
  28.     dsort(A,n,ofs);
  29.  
  30.     return 0;
  31. }
  32.  
  33. void shsort(int *pn, int n, ofstream& fs)
  34. {
  35.     fs<<"\nСортировка методом Шелла:\n";
  36.     fs<<"Исходная последовательность = ";
  37.  
  38.     for (int z1 = 0; z1 < n; z1++)
  39.         fs<<pn[z1]<<" ";
  40.     fs<<endl;
  41.  
  42.     int ncmps = 0, nswaps = 0;
  43.     for (int gap = n-1; gap >= 0; gap--)
  44.         for (int i = 0; (i + gap) < n; i++)
  45.         {
  46.             if (pn[i] < pn[i + gap])
  47.             { swap(pn[i],pn[i + gap]); nswaps++; }
  48.             ncmps++;
  49.         }
  50.  
  51.     fs<<"Результат сортировки = ";
  52.     for (int z2 = 0; z2 < n; z2++)
  53.         fs<<pn[z2]<<" ";
  54.     fs<<endl;
  55.  
  56.     fs<<"Сравнений = "<<ncmps<<" "<<"Перестановок = "<<nswaps<<endl;
  57. }
  58.  
  59. void dsort(int* pn, int n, ofstream& fs)
  60. {
  61.     fs<<"\nСортировка методом Челнока:\n";
  62.     fs<<"Исходная последовательность = ";
  63.  
  64.     for (int z1 = 0; z1 < n; z1++)
  65.         fs<<pn[z1]<<" ";
  66.     fs<<endl;
  67.  
  68.     int ncmps = 0, nswaps = 0;
  69.     for (int i = 0; i < n-1; i++)
  70.     {
  71.          if (pn[i] > pn[i+1])
  72.          {
  73.              swap(pn[i],pn[i+1]); nswaps++;
  74.              for (int k = i; (pn[k] < pn[k-1]) && (k >= 1); k--)
  75.               { swap(pn[k],pn[k-1]); nswaps++; }
  76.          }
  77.  
  78.          ncmps++;
  79.     }
  80.  
  81.     fs<<"Результат сортировки = ";
  82.     for (int z2 = 0; z2 < n; z2++)
  83.         fs<<pn[z2]<<" ";
  84.     fs<<endl;
  85.  
  86.     fs<<"Сравнений = "<<ncmps<<" "<<"Перестановок = "<<nswaps<<endl;
  87. }
  88.  
  89. void swap(int& n1, int& n2)
  90. { int _t = n1; n1 = n2; n2 = _t; }

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

Код выполняет сортировку массива двумя методами: методом Шелла и методом Челнока. Метод Шелла (Shell sort) - это алгоритм сортировки, который использует принцип разделяй и властвуй. Он сортирует массив путем последовательного уменьшения разности между соседними элементами, которые необходимо поменять местами. Метод Челнока (Bubble sort) - это алгоритм сортировки, который сравнивает пары соседних элементов и меняет их местами, если они находятся в неправильном порядке. Этот процесс повторяется до тех пор, пока весь массив не будет отсортирован. Ввод данных:

  • Количество элементов массива N = Вывод данных:
  • Исходная последовательность
  • Сортировка методом Шелла
    • Количество сравнений =
    • Количество перестановок =
  • Сортировка методом Челнока
    • Количество сравнений =
    • Количество перестановок = Переменные:
  • n (количество элементов массива)
  • A (массив для сортировки)
  • filename (имя файла для вывода результатов)
  • ofs (файловый поток для вывода результатов)
  • ncmps (количество сравнений при сортировке методом Шелла)
  • nswaps (количество перестановок при сортировке методом Шелла)
  • fs (файловый поток для вывода результатов сортировки методом Шелла)
  • nswaps (количество перестановок при сортировке методом Челнока)
  • fs (файловый поток для вывода результатов сортировки методом Челнока)

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


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

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

6   голосов , оценка 4 из 5

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

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

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