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