归并排序(递归)C语言版

归并排序是一种稳定的排序算法,其时间复杂度为:O(nlogn)

在这里插入图片描述
本图片来源:https://blog.csdn.net/Silence_R/article/details/86524975
代码如下:

#include<stdio.h>
#define M 1000
int a[M],b[M];
void merge(int left,int mid,int right)
{
 int i=left,j=mid+1,k=left;
 printf("left=%d mid=%d right=%d\n",left,mid,right);
 while(i<=mid&&j<=right)//及拿所分数组左右两边元素有序化 
 {
  if(a[i]<a[j])
  b[k++]=a[i++];
  else
  b[k++]=a[j++];
 }
 while(i<=mid)//有序化后,将剩余元素进行归队处理,一切结束。 
 b[k++]=a[i++];
 while(j<=right)
 b[k++]=a[j++];
 for(int i=left;i<=right;i++)
 {
  a[i]=b[i];
  printf("a[%d]=%d \n",i,a[i]);
 } 
 printf("\n");
}
void mergesort(int left,int right)//分治,将数组进行细分 。一直细分,一直细分,最终只剩两个元素时停止 
{
 int tmp=0;
 if(left<right)
 {
  tmp=(left+right)/2;
  mergesort(left,tmp);//细分中间值左边数组 
  mergesort(tmp+1,right);//细分中间值右边数组 
  merge(left,tmp,right);
 }
 
} 
int main()
{
 int i=0,j=0;
 int n=0;
 scanf("%d",&n);
 for(i=0;i<n;i++)
 {
  scanf("%d",&a[i]);
 }
 mergesort(0,n-1);
 for(i=0;i<n;i++)
 printf("%d ",a[i]);
 return 0;
}

运行结果如下
在这里插入图片描述
在这里插入图片描述

运行过程已经很清楚了,无需过多解释。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二路归并排序是一种高效的排序算法,它结合了分治策略和归并操作,将数组分成两个独立的部分分别进行排序,然后将结果合并。下面是使用C语言实现的基本步骤: 1. **划分**:将待排序的数组分为两部分,通常根据数组长度的一半进行划分。 2. **递归排序**:对每部分递归地应用二路归并排序,直到每个部分只剩一个元素(这已经是有序的)。 3. **合并**:将两个已排序的部分合并成一个有序的数组。这个过程是通过比较两个指针指向的元素,将较小的元素放入结果数组,然后移动对应的指针。 以下是一个简单的C语言本的二路归并排序代码示例: ```c #include <stdio.h> #include <stdlib.h> // 归并两个已排序的区间 void merge(int *arr, int left, int mid, int right) { int i, j, k; int n1 = mid - left + 1; int n2 = right - mid; // 创建临时数组 int L[n1], R[n2]; for (i = 0; i < n1; i++) L[i] = arr[left + i]; for (j = 0; j < n2; j++) R[j] = arr[mid + 1 + j]; i = 0; j = 0; k = left; while (i < n1 && j < n2) { if (L[i] <= R[j]) arr[k++] = L[i++]; else arr[k++] = R[j++]; } // 将剩余未复制的元素添加到结果数组 while (i < n1) arr[k++] = L[i++]; while (j < n2) arr[k++] = R[j++]; } // 二路归并排序函数 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); } } int main() { int arr[] = {9, 7, 5, 11, 12, 2, 14, 3, 10}; int n = sizeof(arr) / sizeof(arr); printf("Before sorting:\n"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } mergeSort(arr, 0, n - 1); printf("\nAfter sorting:\n"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值