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

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


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

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

6   голосов , оценка 4 из 5
Похожие ответы