归并排序—C语言实现
发布人:shili8
发布时间:2024-11-08 11:18
阅读次数:0
**归并排序算法**
================归并排序是一种常见的排序算法,属于分治类算法。它通过递归地将数组分成两个子数组,然后分别对这两个子数组进行排序,最终合并两个有序子数组得到最终结果。
**C语言实现**
-------------
### 归并函数
c// 归并函数void merge(int arr[], int left, int mid, int right) { // 创建临时数组,用于存储归并后的结果 int temp[right - left +1]; // 初始化临时数组的下标 int i = left; int j = mid +1; int k =0; // 归并过程 while (i <= mid && j <= right) { if (arr[i] < arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } // 处理剩余的元素 while (i <= mid) { temp[k++] = arr[i++]; } while (j <= right) { temp[k++] = arr[j++]; } // 将临时数组中的元素复制回原数组 for (int p =0; p < right - left +1; p++) { arr[left + p] = temp[p]; } }
### 归并排序函数
c// 归并排序函数void mergeSort(int arr[], int left, int right) { // 如果子数组中只有一个元素,则认为它是有序的 if (left < right) { // 找到中间下标 int mid = left + (right - left) /2; // 递归地对左半部分和右半部分进行排序 mergeSort(arr, left, mid); mergeSort(arr, mid +1, right); // 归并两个有序子数组 merge(arr, left, mid, right); } }
### 主函数
c// 主函数int main() { int arr[] = {5,2,8,3,1,6,4}; int n = sizeof(arr) / sizeof(arr[0]); // 调用归并排序函数 mergeSort(arr,0, n -1); // 输出有序数组 for (int i =0; i < n; i++) { printf("%d ", arr[i]); } return0; }
**注释**
--------
* 归并函数 `merge` 将两个有序子数组合并成一个有序数组。
* 归并排序函数 `mergeSort` 递归地将数组分成两个子数组,然后分别对这两个子数组进行排序,最终合并两个有序子数组得到最终结果。
* 主函数 `main` 调用归并排序函数,输出有序数组。
**示例**
--------
* 输入:`5283164`
* 输出:`1234568`
**时间复杂度**
--------------
* 归并排序的时间复杂度为 O(n log n),其中 n 是数组长度。
**空间复杂度**
------------* 归并排序的空间复杂度为 O(n),其中 n 是数组长度。