Сортировки. Напишите пожалуйста что означает каждая строка - 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
сначала определяется размер массива и тип заполнения массива. Затем массив заполняется случайными, возрастающими или убывающими значениями в зависимости от выбранного типа заполнения. - Затем пользователю предлагается выбрать тип сортировки. В зависимости от выбранного типа сортировки вызывается соответствующая функция сортировки, которая сортирует массив и выводит отсортированный массив на экран.
- После сортировки выводится количество сравнений и присваиваний, а также время, затраченное на сортировку.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д