排序算法之合併排序
編程語言: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