Сравнить количество перестановок при сортировке массива методами Шелла и челночным - 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 (файловый поток для вывода результатов сортировки методом Челнока)