Я обнаружил, что часто забываю о рекурсии, когда писал домашнее задание по слиянию и сортировке.
Теперь просмотрите и резюмируйте рекурсию следующим образом:
- Сортировка слиянием использует идею «разделяй и властвуй». «Разделяй и властвуй» означает разделение сложных проблем на простые для решения.
- В общем: «Разделяй и властвуй» - это идея для решения сложных проблем, и рекурсия дает ее решение.
Позвольте мне сначала поговорить о рекурсии:
- Проще говоря, рекурсия - это позвонить самому себе. Рекурсивная связь - это установление связи между самим объектом и самим собой.
- Условия рекурсии:
(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 файла, потому что для работы требуется (✿◡‿◡).