环保网站设计是什么,太原seo排名,浙江省建设工程检测协会网站,网站搭建合同模板基本思想#xff1a;
归并排序是建立在归并操作上的一种有效的排序算法#xff0c;该算法是采用分治法的一个非常典型的应用。将已有的子序列合并#xff0c;得到完全有序的序列#xff1b;即先使每个子序列有序#xff0c;再使子序列段间有序。若将两个有序表合并成一个…基本思想
归并排序是建立在归并操作上的一种有效的排序算法该算法是采用分治法的一个非常典型的应用。将已有的子序列合并得到完全有序的序列即先使每个子序列有序再使子序列段间有序。若将两个有序表合并成一个有序表称为称为二路归并。
核心思想 将两个已经排好序的数组合成一个排好序的数组 如果一个数组只有一个元素那么这个数组一定是有序的
问题
我们该如何把一个乱序的数组分为全是只有一个元素的数组答案递归我们又该如何把多个只有一个元素的数组合并成一个有序的数组 代码演示
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);
}void _MergeSort(int* a, int begin, int end, int* tmp)
{if(beginend)//当只有一个元素排序时候就停止了毕竟数组只有一个元素就相当于排好序了return;int mid (begin end) / 2;_MergeSort(a, begin, mid, tmp);//递归的目的是把数组打散_MergeSort(a, mid1, end, tmp);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, sizeof(int) * (end - begin - 1));
}
归并排序的特性总结
归并的缺点在于需要O(N)的空间复杂度归并排序的思想更多的是解决再磁盘中的外排序问题时间复杂度O(NlogN)空间复杂度O(N)稳定性稳定