html5的网站设计与实现是做什么,公司是做小程序还是做网站,域名注册平台哪个好,上海快速建站平台P. S.#xff1a;以下代码均在VS2019环境下测试#xff0c;不代表所有编译器均可通过。 P. S.#xff1a;测试代码均未展示头文件stdio.h的声明#xff0c;使用时请自行添加。 博主主页#xff1a;Yan. yan. … P. S.以下代码均在VS2019环境下测试不代表所有编译器均可通过。 P. S.测试代码均未展示头文件stdio.h的声明使用时请自行添加。 博主主页Yan. yan. C语言专栏 数据结构专栏 力扣牛客经典题目专栏 文章目录 一、归并排序的基本思想二、归并排序的实现1、递归法2、非递归法 一、归并排序的基本思想 归并排序的基本思想 归并排序MERGE-SORT是建立在归并操作上的一种有效的排序算法,该算法是采用分治法Divide andConquer的一个非常典型的应用。将已有序的子序列合并得到完全有序的序列即先使每个子序列有序再使子序列段间有序。若将两个有序表合并成一个有序表称为二路归并。 归并排序核心步骤 二、归并排序的实现 归并排序可以通过递归和非递归的方式来实现。 以下是递归的动态展示图
1、递归法 对于归并排序需使用二叉树中后序的思想将所给目标数组全部类二分而后进行递归当所递归数组个数为1时开始归并。将归并后的子数组复制到原数组中对应位置并开启新一轮的归并这就需要我们动态开辟一个第三方数组tmp来进行辅助。 代码展示
void _MergeSort(int* a, int* tmp, int begin, int end)
{if (begin end)return;int mid (begin end) / 2;MergeSort(a, tmp, begin, mid);MergeSort(a, tmp, mid 1, end);int begin1 begin, end1 mid;int begin2 mid 1, end2 end;int i begin;while (begin1 end1 begin2 end2){if (a[begin1] a[begin2]){tmp[i] a[begin1];}else{tmp[i] a[begin2];}}while (begin1 end1){tmp[i] a[begin1];}while (begin2 end2){tmp[i] a[begin2];}memcpy(a begin, tmp begin, (end - begin 1) * sizeof(int));
}void MergeSort(int* arr, int n)
{int* tmp (int*)malloc(sizeof(int)*n);if(tmp NULL){perror(malloc: MergeSort);return;}_MergeSort(arr, tmp, 0, n-1);free(tmp);tmp NULL;
}
2、非递归法 其思想与递归并无差别区别在于操作方式
在递归实现中我们使用类二分的方法将原目标数组分为2份依次进行二分的归并递归而在非递归中我们不再使用类二分的方法而是直接在原数组上进行操作。在逻辑上认为原数组已经进行处于递归的过程即令gap 1第一次对每一个元素进行归并归并完成后令 gap * 2。第二次对每两个元素进行归并归并完成后令 gap * 2。…第n 次对每2^(n-1)个元素进行归并归并完成后令 gap * 2。直到gap大于元素原本数组个数时结束。 代码如下
void MergeSortNonR(int* a, int n)
{int* tmp (int*)malloc(sizeof(int) * n);if (tmp NULL){perror(MergeSortNonR: malloc fail);return;}int gap 1;while (gap n){for (int i 0; i n; i 2 * gap){int begin1 i, end1 i gap - 1;int begin2 i gap, end2 i 2 * gap - 1;if (begin2 n)对程序代码的优化防止越界break;if (end2 n)对程序代码的优化防止越界end2 n - 1;int j i;while (begin1 end1 begin2 end2){if (a[begin1] a[begin2])tmp[j] a[begin1];elsetmp[j] a[begin2];}while (begin1 end1)tmp[j] a[begin1];while (begin2 end2)tmp[j] a[begin2];memcpy(a i, tmp i, sizeof(int) * (end2 - i 1));}printf(\n);gap * 2;}free(tmp);tmp NULL;
}