🍬个人主页:Yanni.—
🌈数据结构:Data Structure.
🎂C语言笔记:C Language Notes
🏀OJ题分享: Topic Sharing
前言:
前面已经学习了八种排序,今天来介绍最后一种排序--归并排序。希望大家将这九种排序牢记在心,最面试和校招有着很大的帮助!
基础思想
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法
(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序
列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二
路归并。
归并排序核心步骤如下图:
1.将八位数字分成两个区间,现在两个区间无序,只要无序每个区间就再分成两个区间。
2.直到每个区间剩下一个数字,这个时候已经有序,然后将两个区间进行归并。
3.归并的过程就是将两个区间进行排序再合成到一个区间里面。
4.一层一层的进行归并最终是序列达到有序。
代码实现
首先进行归并需要用到数组,我们需要开辟空间。
void MergeSort(int* a, int n)
{
int* tmp = (int*)malloc(sizeof(int)*n);
_MergeSort(a, 0, n - 1, tmp);//归并过程
free(tmp);
}
在这里任然是使用递归算法
void _MergeSort(int* a, int left, int right, int* tmp)
{
if (left >= right)
{
return;
}
int mid = (left + right) >> 1;
//递归
_MergeSort(a, left, mid, tmp);
_MergeSort(a, mid + 1, right, tmp);
递归之后开始归并,归并的过程中一定要考虑右区间或左区间提前归并完成的情况
//开始归并
int begin1 = left,end1 = mid;
int begin2 = mid + 1, end2 = right;
int index = left;
while (begin1 <= end1 && begin2 <= end2)
{
if(a[begin1] > a[begin2])
{
tmp[index++] = a[begin2++];
}
else {
tmp[index++] = a[begin1++];
}
}
while (begin1 <= end1)//当右区间已经归并完成
{
tmp[index++] = a[begin1++];
}
while (begin2 <= end2)//当左区间已经归并完成
{
tmp[index++] = a[begin2++];
}
//拷贝回去
for (int i = left; i <= right; i++)
{
a[i] = tmp[i];
}
}
好啦,这就是今天学习的分享啦!看到希望大家的三连呀!
如果有不当之处,欢迎大佬指正!