在国税网站更换购票员怎么做四川新正路桥建设工程有限公司网站
news/
2025/10/4 14:31:21/
文章来源:
在国税网站更换购票员怎么做,四川新正路桥建设工程有限公司网站,怎么样网站速度快,网站建设大神级公司文章目录 基本思想递归版本思路代码实现 非递归版思路代码实现 特性结果演示 基本思想
归并排序#xff08;MERGE-SORT#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法#xff08;Divide andConquer#xff09;的一个非常典型的应用。将已有序的子… 文章目录 基本思想递归版本思路代码实现 非递归版思路代码实现 特性结果演示 基本思想
归并排序MERGE-SORT是建立在归并操作上的一种有效的排序算法,该算法是采用分治法Divide andConquer的一个非常典型的应用。将已有序的子序列合并得到完全有序的序列即先使每个子序列有序再使子序列段间有序。若将两个有序表合并成一个有序表称为二路归并。
递归版本
思路
1.分解将要排序的序列每次分解为2个序列直到不能再分解 2.合并将分解的序列排序并两两归并 过程我们需要创建一个临时数组tmp将每次归并后的结果存入tmp最后用memcpy将排好后的tmp的数据拷贝到原数组中。
代码实现
void _MergeSort(int* a, int begin, int end, int* tmp)
{if (begin end)return;//序列只有一个数的时候不用也不能再分解int mid (begin end) / 2;_MergeSort(a, begin, mid, tmp);_MergeSort(a, mid1, end, tmp);//将原序列分解为2段序列int i begin;int begin1 i, end1 mid;int begin2 mid 1, end2 end;//确定两段序列的首位下标while (begin1 end1 begin2 end2){if (a[begin1] a[begin2]){tmp[i] a[begin1];}else{tmp[i] a[begin2];}}//将2段序列中的数按顺序存入tmpwhile (begin1 end1){tmp[i] a[begin1];}while (begin2 end2){tmp[i] a[begin2];}//将没存完的那个序列剩下的值有序存入tmpmemcpy(a begin, tmp begin, sizeof(int) * (end - begin 1));//将tmp拷贝给原数组加上begin定位排序好的值因为begin是我们操作2个序列的前一个序列的首下标。不加begin的话就是拷贝整个序列的第一个值可能不是我们正在归并的序列还没有被排序。
}
void MergeSort(int* a, int n)
{int* tmp (int*)malloc(sizeof(int) * n);if (tmp NULL){perror(malloc fail);return;}_MergeSort(a, 0, n - 1, tmp);free(tmp);
}非递归版
思路
递归版本时我们通过将要排序的序列分解、合并在合并的过程中完成排序。在非递归的版本中合并的思路和代码实现是一样主要是如何将序列分解递归版本可以利用子问题分治实现非递归就要用循环模拟递归我们这里引入一个gap 代表序列的数据个数首先让gap等于1这样就将序列分解为好了然后开始两两归并之后让gap不断2倍化直到gap等于原数组的数据个数。这里分解后的序列首位下标之差就是gap-1因为是双闭区间序列的数据个数就是gap)。这里还要注意分解的序列的首尾下标不能超过原序列的数据个数。
代码实现
void MergeSortnonR(int* a, int n)
{int* tmp (int*)malloc(sizeof(int) * n);if (tmp NULL){perror(malloc fail);return;}//临时数组存归并好的数据int gap 1;//分解好的序列的数据个数为gapwhile (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;//要归并的2个序列的首尾下标int j begin1;if (end1 n || begin2 n){break;}if (end2 n){end2 n - 1;}//保证首尾下标不越界while (begin1 end1 begin2 end2){if (a[begin1] a[begin2]){tmp[j] a[begin1];}else{tmp[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));//将归并好的数据拷贝给原数组}gap * 2;//放大排序序列的区间begin1到end1和begin2到end2这两个区间的数据个数是2倍的gap,所以gap * 2后新序列还是有序的只需继续将新序列两两归并即可。}
}特性
归并的缺点在于需要O(N)的空间复杂度归并排序的思考更多的是解决在磁盘中的外排序问题。时间复杂度O(N*logN)空间复杂度O(N)稳定性稳定
结果演示
int main()
{int a[] { 2,5,9,1,6,11,3,4 };int n1 sizeof(a) / sizeof(a[0]);MergeSort(a, n1);printf(MergeSort:);for (int i 0; i n1; i){printf(%d , a[i]);}printf(\n);int b[] { 2,7,3,4,1,2,6,5,11,8 };int n2 sizeof(b) / sizeof(b[0]);
MergeSortnonR(b, n2);
printf(MergeSortnonR:);for (int i 0; i n2; i){printf(%d , b[i]);}return 0;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/927227.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!