LinuxC合并排序

排序算法之合并排序

编程语言: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 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章