归并排序即将一个数组分成若干个小组,每组只有一个数,再相邻两个组进行有序的组合,组合到最后整体即为有序。
废话不多说,直接看代码。
void MergeSort(int arr[], int len)//传入要排序的数组和数组长度
{
int* ptmp = (int*)malloc(sizeof(int)*len);//创建临时数组用来保存排好序的数
MergeS(arr, ptmp, 0, len - 1);
free(ptmp);//释放内存,小心内存泄漏
}
void MergeS(int arr[], int temp[], int startindex, int endindex)
{
if (startindex < endindex)
{
int midindex = (startindex + endindex) / 2;
MergeS(arr, temp, startindex, midindex);//使用递归,将原数组分成若干只有一个元素的小组//这一步分解左边
MergeS(arr, temp, midindex + 1, endindex);//这一步分解右边
Merge(arr, temp, startindex, midindex, endindex);//将两个相邻小组归并排序
}
}
void Merge(int arr[], int temp[], int s, int m, int e)
{
int i = s;//左边小组第一个
int j = m + 1;//右边小组第一个
int k = s;//temp这个临时数组开始能存放数据的下标
while (i < m + 1 && j < e + 1)\\小组的边界分别为m+1和e+1
{
if (arr[i] <= arr[j])
{
temp[k++] = arr[i++];
}
else
{
temp[k++] = arr[j++];
}
}
while (j < e + 1)//判断小组是否还有未排序的数
{
temp[k++] = arr[j++];
}
while (i < m + 1)//判断小组是否还有未排序的数
{
temp[k++] = arr[i++];
}
for (int i = s; i <= e; i++)//将临时储存排好序的数组的赋给原数组
{
arr[i] = temp[i];
}
}