C语言二分归并排序的实现

本文介绍了博主在十一假期中学习的二分归并排序算法,并分享了一段用C语言实现的代码,详细阐述了算法的分支归并思想。通过调试和测试,博主在重温C语言的同时,增加了新的知识。

趁着十一小长假,自学了一点儿算法(初级),复杂度最低的就是二分归并排序(nlog(n)),也是分支归并思想的体现。博主,基于闲的没事的原则,好久没碰C语言,所以亲自调试了一段代码,并且进行debug测试得到。其中学习了不少新的知识。
直接贴代码:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include<math.h>
#define MAX 0x11111111

void Merge(int* A, int p, int q, int r)
{   
    int n1 = q - p + 1;
    int n2 = r - q;
    assert(n1 >= 0 && n2 >= 0);
    
二分归并排序是一种基于分治策略的高效排序算法。在C语言中,它首先将数组分为两半,对每一半递归地进行排序,然后合并两个已排序的部分。对于给定的待排序数组 [38, 27, 43, 3, 9, 82, 10],以下是简单的步骤: 1. **划分**:选择数组中间位置作为基准点,比如第一次划分我们将数组一分为二:[38, 27, 43, 3] 和 [9, 82, 10]。 2. **递归**:分别对这两部分进行递归排序。对第一部分,我们继续这个过程直到每个子序列只剩下一个元素,这本身就是有序的。对第二部分也做同样的操作。 3. **合并**:当两部分都排好序后,开始合并。从两部分的第一个元素开始比较,较小的放入结果数组,直到其中一个部分的元素全部放入,然后再把另一个部分剩余的元素依次添加到结果数组。 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 mergeSort(int arr[], int l, int r) { if (l < r) { int m = l+(r-l)/2; mergeSort(arr, l, m); mergeSort(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]); mergeSort(arr, 0, n-1); for(int i=0; i<n; i++) { printf("%d ", arr[i]); } return 0; } ``` 当你运行这段代码,它会输出排序后的数组:`3 9 10 27 38 43 82`。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值