Сортировки. Напишите пожалуйста что означает каждая строка - C (СИ)
Формулировка задачи:
Всем привет. Напишите пожалуйста к каждой строке что она означает. Код не совсем мой,а друг скинул, но он занят чтобы объяснить. Ато преподаватель будет в субботу спрашивать, поэтому прошу вас
Вот сам код:
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <time.h>
#include <windows.h>
#include <ctime>
using namespace std;
int com=0,as=0;
int bubble(int *arr,int sz){
int k;
for(int i=0;i<sz;i++){
for(int j=1;sz-j!=0;j++){
com++;
if(arr[j]<arr[j-1]){
k=arr[j];
arr[j]=arr[j-1];
arr[j-1]=k;
as=as+3;
}
}
}
return *arr;
}
int choice(int *arr,int sz){
int min,k,t;
for(int i=0;i<sz;i++){
min=arr[i];
as++;
for(int j=i+1;j<sz;j++){
com++;
if(arr[j]<min){
min=arr[j];
t=j;
as=as+2;
}
}
k=arr[i];
arr[i]=min;
arr[t]=k;
as=as+3;
}
return *arr;
}
int insert(int *arr,int sz){
int k;
for(int i=1;i<sz;i++){
for(int j=i;j>0;j--){
com++;
if(arr[j-1]>arr[j]){
k=arr[j-1];
arr[j-1]=arr[j];
arr[j]=k;
as=as+3;
}
}
}
return *arr;
}
void sort(int arr[],int low,int mid,int high){
int b[10000];
int i = low, j = mid + 1, k = 0;
com=com+4;
while(i <= mid && j <= high){
com++;
if (arr[i] <= arr[j]){
b[k++] = arr[i++];
as++;
}
else{
b[k++] = arr[j++];
as++;
}
}
while(i<=mid){b[k++]=arr[i++];as++;}
while(j<=high){b[k++]=arr[j++];as++;}
k--;
while(k>=0){
arr[low+k]=b[k];
k--;
as++;
}
}
void interflow(int arr[],int low,int high){
com++;
if (low<high) {
int m=(high+low)/2;
interflow(arr, low, m);
interflow(arr, m + 1, high);
sort(arr, low, m, high);
}
}
int main (){
setlocale(0,"Russian");
int select=0,size=0,type=0;
clock_t start,stop;
srand(time(0));
printf("Размер массива = ");
scanf("%i",&size);
int array[size];
printf("\n1.Случайными\n2.По возрастанию\n3.По убыванию\nТип заполнения = ");
scanf("%i",&type);
switch(type){
case 1:
for(int i=0;i<size;i++)array[i]=rand()%100;
break;
case 2:
for(int i=0;i<size;i++)array[i]=i;
break;
case 3:
for(int i=size-1;i>=0;i--)array[i]=size-i-1;
break;
default:
printf("Ошибка\n");
}
printf("\nНеотсортированный массив = ");
for (int i=0;i<size;i++)printf("%i ",array[i]);
printf("\n\n1.Пузырьковая\n2.Выбор\n3.Вставка\n4.Слияние\nТип сортировки = ");
scanf("%i",&select);
switch(select){
case 1:
start=clock();
bubble(array,size);
stop=clock();
break;
case 2:
start=clock();
choice(array,size);
stop=clock();
break;
case 3:
start=clock();
insert(array,size);
stop=clock();
break;
case 4:
start=clock();
interflow(array,0,size-1);
stop=clock();
break;
default:
printf("ошибка");
}
printf("Отсортированный массив = ");
for(int i=0;i<size;i++)printf("%i ",array[i]);
printf("\nКоличество сравнений = %i\n",com);
printf("Количество присвоений = %i\n",as);
printf("Время = %i\n",stop-start);
getch();
return 0;
}Решение задачи: «Сортировки. Напишите пожалуйста что означает каждая строка»
textual
Листинг программы
#include <stdio.h>
#include <time.h>
int com = 0, as = 0;
int bubble(int *arr, int sz) {
int k = 0, i = 0, j = 0;
for (i = 0; i<sz; i++) {
for (j = 1; sz - j != 0; j++) {
com++;
if (arr[j]<arr[j - 1]) {
k = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = k;
as = as + 3;
}
}
}
return *arr;
}
int choice(int *arr, int sz) {
int min = 0, k = 0, t = 0, i = 0, j = 0;
for (i = 0; i<sz; i++) {
min = arr[i];
as++;
for (j = i + 1; j<sz; j++) {
com++;
if (arr[j]<min) {
min = arr[j];
t = j;
as = as + 2;
}
}
k = arr[i];
arr[i] = min;
arr[t] = k;
as = as + 3;
}
return *arr;
}
int insert(int *arr, int sz) {
int k = 0, i = 0, j = 0;
for (i = 1; i<sz; i++) {
for (j = i; j>0; j--) {
com++;
if (arr[j - 1]>arr[j]) {
k = arr[j - 1];
arr[j - 1] = arr[j];
arr[j] = k;
as = as + 3;
}
}
}
return *arr;
}
void sort(int arr[], int low, int mid, int high) {
int b[10000];
int i = low, j = mid + 1, k = 0;
com = com + 4;
while (i <= mid && j <= high) {
com++;
if (arr[i] <= arr[j]) {
b[k++] = arr[i++];
as++;
}
else {
b[k++] = arr[j++];
as++;
}
}
while (i <= mid)
b[k++] = arr[i++]; as++;
while (j <= high)
b[k++] = arr[j++]; as++;
k--;
while (k >= 0) {
arr[low + k] = b[k];
k--;
as++;
}
}
void interflow(int arr[], int low, int high) {
int m = 0;
com++;
if (low<high) {
m = (high + low) / 2;
interflow(arr, low, m);
interflow(arr, m + 1, high);
sort(arr, low, m, high);
}
}
int main() {
setlocale(0, "Russian");
srand(time(0));
int select = 0, size = 0, type = 0, i = 0, *array = NULL;
clock_t start = NULL, stop = NULL;
printf("Размер массива = ");
scanf("%i", &size);
array = malloc(sizeof(int)*size);
printf("\n1.Случайными\n2.По возрастанию\n3.По убыванию\nТип заполнения = ");
scanf("%i", &type);
switch (type) {
case 1:
for (i = 0; i<size; i++)
array[i] = rand() % 100;
break;
case 2:
for (i = 0; i<size; i++)
array[i] = i;
break;
case 3:
for (i = size - 1; i >= 0; i--)
array[i] = size - i - 1;
break;
default:
printf("Ошибка\n");
}
printf("\nНеотсортированный массив = ");//Вывод массива на экран
for (i = 0; i<size; i++)
printf("%i ", array[i]);
printf("\n\n1.Пузырьковая\n2.Выбор\n3.Вставка\n4.Слияние\nТип сортировки = ");
scanf("%i", &select);
switch (select) {
case 1:
start = clock();
bubble(array, size);
stop = clock();
break;
case 2:
start = clock();
choice(array, size);
stop = clock();
break;
case 3:
start = clock();
insert(array, size);
stop = clock();
break;
case 4:
start = clock();
interflow(array, 0, size - 1);
stop = clock();
break;
default:
printf("ошибка");
}
printf("Отсортированный массив = ");
for (i = 0; i<size; i++)//Вывод массива на экран
printf("%i ", array[i]);
printf("\nКоличество сравнений = %i\n", com);
printf("Количество присвоений = %i\n", as);
printf("Время = %i\n", stop - start);
free(array);
return 0;
}
Объяснение кода листинга программы
comиas- это счетчики, используемые внутри функций сортировки для отслеживания количества сравнений и присваиваний соответственно.- Функция
bubbleреализует сортировку пузырьком. Она проходит по массиву несколько раз, сравнивая соседние элементы и меняя их местами, если они находятся в неправильном порядке. Процесс продолжается до тех пор, пока массив не будет полностью отсортирован. - Функция
choiceреализует сортировку выбором. Она находит минимальный элемент в неотсортированной части массива и меняет его местами с первым элементом неотсортированной части. Затем функция рекурсивно вызывает себя для сортировки оставшейся части массива. - Функция
insertреализует сортировку вставками. Она проходит по массиву, сравнивая каждый элемент с текущим элементом и, если текущий элемент больше следующего элемента, вставляет текущий элемент перед следующим элементом. - Функция
sortреализует сортировку слиянием. Она разделяет массив на две половины, сортирует каждую половину отдельно, а затем объединяет две отсортированные половины в один отсортированный массив. - Функция
interflowреализует сортировку слиянием. Она разделяет массив на две половины, сортирует каждую половину отдельно, а затем объединяет две отсортированные половины в один отсортированный массив. - В функции
mainсначала определяется размер массива и тип заполнения массива. Затем массив заполняется случайными, возрастающими или убывающими значениями в зависимости от выбранного типа заполнения. - Затем пользователю предлагается выбрать тип сортировки. В зависимости от выбранного типа сортировки вызывается соответствующая функция сортировки, которая сортирует массив и выводит отсортированный массив на экран.
- После сортировки выводится количество сравнений и присваиваний, а также время, затраченное на сортировку.