排序算法之合并排序
编程语言:C
编译环境:gcc
操作系统:Linux
算法分析:对于连个已将排序ok的数组,想把他们合并一起并依照有序的排放,那么就以升序为例。假设连个待排序数组都为升序和一个待排序数组空间,第一次比较,先从两个数组的首位分别获取两个值比较这两个值,然后然较小的值放入待排序数组空间的首位;第二次比较,对于首位元素已经放入待排序数组空间的数组,那么就拿出数组的第二元素与另一个数组进行比较首位进行比较,还是较小的元素放入待排序数组空间的第二位。那么第三次、第四次以此类推,注意终止条件如果一个数组中先没有元素则进行标记不进行比较。
#include <stdio.h>
/*
* @brief 将两个已将排序好的数组合并为一个升序数组
* @param *arr1:第一个已经排好序的数组名或数组首地址
* @param len1: 第一个数组长度
* @param *arr2:第二个已经排好序的数组名或数组首地址
* @param len2: 第二个数组长度
* @param *arr3:第三个数组名或数组首地址,也就是要接收数组1和数组2的数组
* @note: 第三个数组的长度应大于等于前两个数组的长度总和,否者将会导致内存泄漏。前两个数组均为序
* @retval 无
* */
void Ascending_Merge_Sort(int *arr1, int len1, int *arr2, int len2, int *arr3)
{
int i = 0, j = 0, k = 0; //统计循环次数
int arr3_len = len1 + len2; //计算合并后数组的总统长度
int merge_arr[arr3_len]; //定义一个临时存放合并后数组的容器
for(i=0; i<arr3_len; i++)
{
if(arr1[j] < arr2[k] && j < len1)
merge_arr[i] = arr1[j++];
else
merge_arr[i] = arr2[k++];
}
while(arr3_len-- >= 0 ) //将合并后的临时数组拷贝到数组3中
arr3[arr3_len] = merge_arr[arr3_len];
}
/*
* @brief 将两个已将排序好的数组合并为一个降序数组
* @param *arr1:第一个已经排好序的数组名或数组首地址
* @param len1: 第一个数组长度
* @param *arr2:第二个已经排好序的数组名或数组首地址
* @param len2: 第二个数组长度
* @param *arr3:第三个数组名或数组首地址,也就是要接收数组1和数组2的数组
* @note: 第三个数组的长度应大于等于前两个数组的长度总和,否者将会导致内存泄漏。前两个数组均为序
* @retval 无
* */
void Descending_Merge_Sort(int *arr1, int len1, int *arr2, int len2, int *arr3)
{
int i = 0, j = 0, k = 0;
int arr3_len = len1 + len2;
int merge_arr[arr3_len]; //定义一个临时存放合并后数组的容器
for(i=0; i<arr3_len; i++)
{
if(arr1[j] > arr2[k] && j >=0)
merge_arr[i] = arr1[j--];
else
merge_arr[i] = arr2[k--];
}
while(arr3_len-- >= 0 ) //将合并后的临时数组拷贝到数组3中
arr3[arr3_len] = merge_arr[arr3_len];
}
/*
* @brief 单行输出数组所有元素中间用空格隔开
* @param *a:数组的首地址或数组名
* @param len:输出数组的长度
* @note 没有使用换行输出
* @retval 无
* */
void Print_Array(int *a, int len)
{
int i=0;
for(i=0; i<len; i++)
printf("%d ", a[i]);
printf("\n");
}
int main()
{
int arr1[5] = {1, 3, 4, 5, 8};
int arr2[5] = {0, 2, 6, 7, 9};
int arr3[10] = {};
printf("原数组为:\n");
Print_Array(arr1, 5);
Print_Array(arr2, 5);
printf("采用升序合并排序,合并后的数组为:\n");
Ascending_Merge_Sort(arr1, 5, arr2, 5, arr3);
Print_Array(arr3, 10);
printf("采用降序合并排序,合并后的数组为:\n");
Descending_Merge_Sort(arr1, 5, arr2, 5, arr3);
Print_Array(arr3, 10);
return 0;
}
运行结果
原数组为:
1 3 4 5 8
0 2 6 7 9
采用升序合并排序,合并后的数组为:
0 1 2 3 4 5 6 7 8 9
采用降序合并排序,合并后的数组为:
9 8 7 6 5 4 3 2 1 0