Сравнить количество перестановок при сортировке массива методами Шелла и челночным - C (СИ)
Формулировка задачи:
Дан массив из 10000 элементов. Нужно провести сортировку шелла по убыванию, а так же челночную сортировку, а затем сравнить эти методы по числу сравнений и перестановок элементов, вывести эти значения и отсортированный массив в файл.
Пока имеется только вот это:
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #include <conio.h>
- #include <math.h>
- #include <time.h>
- void vvod_m(int n, int a[])
- {
- int i;
- srand(time(0));
- for(i=0;i<n;i++)
- {
- a[i]=rand()%n;
- }
- }
- void vyvod(int n, int a[])
- {
- int i;
- FILE*h;
- h=fopen("out.txt", "w");
- for(i=0;i<n;i++)
- {
- fprintf(h,"%d \n", a[i]);
- }
- fclose(h);
- }
- int ShellSort(int a[],int len)
- {
- long d=len,i,j;
- int c;
- do
- {
- d=d/2;
- i=0;
- while ((j=i+d)<len)
- {
- if (a[i]>a[j])
- {
- c=a[i];
- a[i]=a[j];
- a[j]=c;
- };
- i++;
- };
- }
- while (d>1);
- return 0;
- }
- int main()
- {
- int a[10000], n ;
- do
- {
- printf ("Vvedite n \n");
- scanf ("%d", &n);
- }
- while ((n<=0)||(n>10000));
- vvod_m(n,a);
- ShellSort(a,10000);
- vyvod(n,a);
- return 0;
- }
Решение задачи: «Сравнить количество перестановок при сортировке массива методами Шелла и челночным»
textual
Листинг программы
- #include <iostream>
- #include <fstream>
- #include <locale.h>
- using namespace std;
- void shsort(int *pn, int n, ofstream& f);
- void dsort(int* pn, int n, ofstream& f);
- void swap(int& n1, int& n2);
- using namespace std;
- int main()
- {
- setlocale(LC_ALL,"Russian");
- const char* filename = "d:\\output.txt";
- ofstream ofs(filename,ofstream::out);
- int n = 0;
- cout << "Введите количество элементов массива N = "; cin>>n;
- int i = 0, *A = new int[n];
- while (i < n) A[i++] = i + 1;
- shsort(A,n,ofs);
- dsort(A,n,ofs);
- return 0;
- }
- void shsort(int *pn, int n, ofstream& fs)
- {
- fs<<"\nСортировка методом Шелла:\n";
- fs<<"Исходная последовательность = ";
- for (int z1 = 0; z1 < n; z1++)
- fs<<pn[z1]<<" ";
- fs<<endl;
- int ncmps = 0, nswaps = 0;
- for (int gap = n-1; gap >= 0; gap--)
- for (int i = 0; (i + gap) < n; i++)
- {
- if (pn[i] < pn[i + gap])
- { swap(pn[i],pn[i + gap]); nswaps++; }
- ncmps++;
- }
- fs<<"Результат сортировки = ";
- for (int z2 = 0; z2 < n; z2++)
- fs<<pn[z2]<<" ";
- fs<<endl;
- fs<<"Сравнений = "<<ncmps<<" "<<"Перестановок = "<<nswaps<<endl;
- }
- void dsort(int* pn, int n, ofstream& fs)
- {
- fs<<"\nСортировка методом Челнока:\n";
- fs<<"Исходная последовательность = ";
- for (int z1 = 0; z1 < n; z1++)
- fs<<pn[z1]<<" ";
- fs<<endl;
- int ncmps = 0, nswaps = 0;
- for (int i = 0; i < n-1; i++)
- {
- if (pn[i] > pn[i+1])
- {
- swap(pn[i],pn[i+1]); nswaps++;
- for (int k = i; (pn[k] < pn[k-1]) && (k >= 1); k--)
- { swap(pn[k],pn[k-1]); nswaps++; }
- }
- ncmps++;
- }
- fs<<"Результат сортировки = ";
- for (int z2 = 0; z2 < n; z2++)
- fs<<pn[z2]<<" ";
- fs<<endl;
- fs<<"Сравнений = "<<ncmps<<" "<<"Перестановок = "<<nswaps<<endl;
- }
- void swap(int& n1, int& n2)
- { int _t = n1; n1 = n2; n2 = _t; }
Объяснение кода листинга программы
Код выполняет сортировку массива двумя методами: методом Шелла и методом Челнока.
Метод Шелла (Shell sort) - это алгоритм сортировки, который использует принцип разделяй и властвуй
. Он сортирует массив путем последовательного уменьшения разности между соседними элементами, которые необходимо поменять местами.
Метод Челнока (Bubble sort) - это алгоритм сортировки, который сравнивает пары соседних элементов и меняет их местами, если они находятся в неправильном порядке. Этот процесс повторяется до тех пор, пока весь массив не будет отсортирован.
Ввод данных:
- Количество элементов массива N = Вывод данных:
- Исходная последовательность
- Сортировка методом Шелла
- Количество сравнений =
- Количество перестановок =
- Сортировка методом Челнока
- Количество сравнений =
- Количество перестановок = Переменные:
- n (количество элементов массива)
- A (массив для сортировки)
- filename (имя файла для вывода результатов)
- ofs (файловый поток для вывода результатов)
- ncmps (количество сравнений при сортировке методом Шелла)
- nswaps (количество перестановок при сортировке методом Шелла)
- fs (файловый поток для вывода результатов сортировки методом Шелла)
- nswaps (количество перестановок при сортировке методом Челнока)
- fs (файловый поток для вывода результатов сортировки методом Челнока)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д