Язык C основан на рекурсивной сортировке слиянием

Я обнаружил, что часто забываю о рекурсии, когда писал домашнее задание по слиянию и сортировке.

Теперь просмотрите и резюмируйте рекурсию следующим образом:

  • Сортировка слиянием использует идею «разделяй и властвуй». «Разделяй и властвуй» означает разделение сложных проблем на простые для решения.
  • В общем: «Разделяй и властвуй» - это идея для решения сложных проблем, и рекурсия дает ее решение.

Позвольте мне сначала поговорить о рекурсии:

  1. Проще говоря, рекурсия - это позвонить самому себе. Рекурсивная связь - это установление связи между самим объектом и самим собой.
  2. Условия рекурсии:
    (1) Подзадача должна соответствовать исходной задаче и быть проще.
    (2) Рекурсия должна иметь выход, иначе она никогда не выйдет.

Затем мы используем сортировку слиянием, чтобы лучше понять рекурсию:

  • Общая идея сортировки слиянием очень проста: сначала разделите, а затем объедините.

Каждый раз, когда оно делится на две части, когда это разделение закончится?

Ответ: Подумайте об этом так, что в конечном итоге мы хотим получить отсортированный большой массив. Подзадача состоит в том, чтобы получить отсортированные небольшие массивы. Когда будут упорядочены маленькие массивы? Когда в массиве только один элемент, Затем заказывается небольшой массив. Таким образом, мы получаем рекурсивное условие low <high.

Прямая картинка вверху:
Вставьте описание изображения сюда
На самом деле я тоже был в то время, учитель тоже понимал мысли, излагаемые в классе, но я все еще не понимал, как он слился и образовал последовательность.Это также критика моего рекурсивного забывания.
Код, который я написал, MERGE объединяет и сортирует два небольших массива. (За этим стоит код)
На самом деле, рекурсивные шаги легко понять: продолжайте с рисунка выше:
Вставьте описание изображения сюда

Код ↓

#include <stdio.h>
#include <stdlib.h>
#define N 1000000


void Mergesort(int *A,int low,int high,int *temp)
{
    
    
    if(low < high)
    {
    
    
        int mid = (high+low)/2;
        Mergesort(A,low,mid,temp);
        Mergesort(A,mid+1,high,temp);
        MERGE(A,low,mid,high,temp);
    }
}

void MERGE(int *A,int low,int mid,int high,int *temp)
{
    
    
    int i=low;int j=mid;
    int m=mid+1;int n=high;
    int k=0;
    //开始合并两个数组;
    while(i <= j && m <= n)
    {
    
    
        if(A[i] <= A[m])
        {
    
    
            temp[k++] = A[i++];
        }
        else
        {
    
    
            temp[k++] = A[m++];
        }
    }
    while(i <= j)
    {
    
    
        temp[k++] = A[i++];
    }

    while(m <= n)
    {
    
    
        temp[k++] = A[m++];
    }

    //把temp数组中的结果装回A数组
    for(i = 0; i < k; i++)
    {
    
    
        A[i+low] = temp[i];
    }
}

int main(int argc, const char * argv[])
{
    
    
    int i,j;
    int num[100000];
    int temp[100000];
    FILE* fp = fopen("1.txt","r");//读文件
    FILE* stream = fopen("2.txt","w");//向文件中写入
    if(fp==NULL)
    {
    
    
        printf("没找到文件");
        return 0;
    }
    for(i=0;i<100000;i++)
    {
    
    
        fscanf(fp,"%d",&num[i]);
    }
    fclose(fp);
    Mergesort(num,0,99999,temp);
    for(j=0;j<100000;j++)
    {
    
    
        fprintf(stream,"%d\n",num[j]);
    }
    fclose(stream);
    return 0;
}

В моем коде есть операции чтения и записи txt файла, потому что для работы требуется (✿◡‿◡).

рекомендация

отblog.csdn.net/qq_44165430/article/details/105462468