//归并排序(分治思想)
//按照快速排序递归地将待排区间依次划分为两个区间,区间只剩一个数的时候停止,
//如果一个区间只有一个数,可以看作是有序区间,然后对左右两个小区间进行归并,归并后依然保持有序
//依次将左右两个有序的子区间归并为一个大的有序区间,并返回给上一次递归
//直到划分的所有小区间归并为一个有序序列,归并排序完成
//时间复杂度O(NlogN) 空间复杂度O(N)
//=========== 归并排序(递归)
//归并函数
void MergeArray(int arr[], int left, int mid, int right, int tmp[])
{
int index1 = left;
int index2 = mid;
int tmp_index = left; //新数组元素下标从left到right
while (index1 < mid&&index2 < right) //如果两个有序子数组没有遍历完,一直遍历到某个数组遍历结束
{
if (arr[index1] < arr[index2]) //将值小的元素先复制到新数组
tmp[tmp_index++] = arr[index1++];
else
tmp[tmp_index++] = arr[index2++];
}
while (index1 < mid)//将未遍历完子数组的剩余元素赋值到新数组
tmp[tmp_index++] = arr[index1++];
while (index2 < right)
tmp[tmp_index++] = arr[index2++];
int i = left; //将tmp排序的元素复制到arr进行合并
for (; i < right; i++)
arr[i] = tmp[i];
return;
}
//递归函数
void _MergeSort(int arr[], int left, int right, int tmp[])
{
if (right - left <= 1)
return;
int mid = left + (right - left) / 2; //将待排序列一分为2,如果某部分元素少于等于1,则认为排好序
_MergeSort(arr, left, mid, tmp);
_MergeSort(arr, mid + 1, right, tmp);
MergeArray(arr, left, mid, right, tmp);//合并两个有序区间
return;
}
//主函数
void MergeSort(int arr[], int size)
{
if (arr == NULL || size <= 1)
return;
int left = 0;
int right = size;
int* tmp = (int*)malloc(sizeof(int)*size); //申请空间保存已序区间
_MergeSort(arr, left, right, tmp); //递归函数排序
free(tmp);
return;
}
归并排序--排序算法
最新推荐文章于 2023-09-25 20:15:30 发布