赞
踩
一、归并排序的原理
归并排序(Merge Sort)是一种基于分治思想的高效排序算法。其核心思想是将待排序的数组分为两个相等的部分,对这两个部分分别进行递归排序,最后将两个有序的子数组合并成一个有序的整体。可见归并排序的时间复杂度为 O(nlog2n)。
下面我们来详细地介绍一下归并排序的过程:
分解将待排序的数组递归分解为越来越小的子序列,直到分解成单个元素的子序列。
合并将相邻的两个单个元素的子序列进行合并,成为一个长度为 2 的有序子序列;接着,将相邻的两个长度为 2 的有序子序列合并,成为一个长度为 4 的有序子序列;以此类推,直到合并成一个完整的排好序的序列。
二、归并排序的C语言实现
以下是归并排序的 C 语言实现:
- #include <stdio.h>
-
- // 合并函数
- void merge(int arr[], int l, int m, int r){
- int i, j, k;
- int n1 = m - l + 1;
- int n2 = r - m;
-
- // 临时数组
- int L[n1], R[n2];
-
- // 把数据存储到临时数组
- for (i = 0; i < n1; i++){
- L[i] = arr[l + i];
- }
- for (j = 0; j < n2; j++){
- R[j] = arr[m + 1 + j];
- }
-
- // 归并临时数组到原数组
- i = 0;
- j = 0;
- k = l;
- while (i < n1 && j < n2){
- if (L[i] <= R[j]){
- arr[k] = L[i];
- i++;
- } else {
- arr[k] = R[j];
- j++;
- }
- k++;
- }
-
- // 把剩余的元素复制到原数组
- while (i < n1){
- arr[k] = L[i];
- i++;
- k++;
- }
- while (j < n2){
- arr[k] = R[j];
- j++;
- k++;
- }
- }
-
- // 归并排序函数
- void merge_sort(int arr[], int l, int r){
- if (l < r) {
- int m = l + (r - l) / 2;
-
- // 分别递归排序左右两部分
- merge_sort(arr, l, m);
- merge_sort(arr, m + 1, r);
-
- // 合并排序后的两部分
- merge(arr, l, m, r);
- }
- }
-
- // 测试
- int main(){
- int arr[] = {38, 27, 43, 3, 9, 82, 10};
- int n = sizeof(arr)/sizeof(arr[0]);
-
- // 排序前
- printf("Before sorting: ");
- for (int i = 0; i < n; i++){
- printf("%d ", arr[i]);
- }
- printf("\n");
-
- // 排序
- merge_sort(arr, 0, n - 1);
-
- // 排序后
- printf("After sorting: ");
- for (int i = 0; i < n; i++){
- printf("%d ", arr[i]);
- }
- printf("\n");
-
- return 0;
- }
输出结果如下:
- Before sorting: 38 27 43 3 9 82 10
- After sorting: 3 9 10 27 38 43 82
以上代码中,merge 函数用于合并两个有序数组,merge_sort 函数是归并排序的主体函数,用于递归排序和合并数组。我们在 main 函数中使用了 merge_sort 对数组进行了排序。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。