C语言实现【归并排序】:数据结构最后一章排序算法。全部使用c语言代码实现,代码全程有注释简单易懂,动图演示排序过程,包含算法定义,算法思想,算法描述,学习笔记,时间复杂度空间复杂度等常考内容

题目

今天开始更新数据结构C语言版的十大排序算法,因为我只考常用的一些排序算法,所以会只更新我学的6个常用算法,分为算法思想,算法代码和执行结果三个部分展现。

更新第一篇:C语言实现归并排序


以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨,共同进步。——来自考研路上的lwj。QQ:2394799692

一、算法思想

1.算法执行过程动图演示:

请添加图片描述

2.定义:

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。

3.算法思想:

one:把长度为n的输入序列分成两个长度为n/2的子序列
two:对这两个子序列分别采用归并排序
three:将两个排序好的子序列合并成一个最终的排序序列

4.我的总结:

归并排序就是把两个已经有序的序列合并成一个有序序列。
稳定性为:稳定
时间复杂度为:O(n log2^n)
(因为n个元素的趟数=log2^n,每趟的时间复杂度为O(n),那么整个算法的时间复杂度就是:O(n log2^n))
空间复杂度为:O(n)

5.学习笔记:

请添加图片描述

二、代码部分

1.引入库

代码如下(示例):

#include<stdio.h>

2.主函数部分

代码如下(示例):

void merge(int a[], int low, int mid, int high)
{
	int* b = (int*)malloc(high * sizeof(int));//定义辅助数组b用于暂时存放未排序数组
	int i, j, k;
	for (k = low; k <= high; k++)
		b[k] = a[k];//将a中所有值复制到b
	for (i = low, j = mid + 1, k = i; i <= mid && j <= high; k++)
	{
		if (b[i] < a[j])a[k] = b[i++];
		else a[k] = b[j++];//依次比较两部分的元素,将最小值放到a中
	}
	while (i <= mid)a[k++] = b[i++];
	while (j <= high)a[k++] = b[j++];//因为需要归并的两部分数组都是有序的,因此当有一部分元素全放进a中后,另一部分的元素本身已有序就不用比较直接依次全部放入a即可
}
void mergesort(int a[], int low, int high)
{
	if (low < high)//当low<high时,说明当前数组还没有完全有序,所以要进行排序
	{
		int mid = (low + high) / 2;//从中间划分为两个子表
		mergesort(a, low, mid);//对左半部分递归地进行归并排序
		mergesort(a, mid + 1, high);//对右半部分递归地进行归并排序
		merge(a, low, mid, high);//归并算法-将左右两个有序子序列合并为一个
	}
}
void main()
{
	int a[] = { 4,5,6,7,8,9,1,2,3 };
	int high = sizeof(a) / sizeof(int);//定义high的值为数组元素个数
	mergesort(a, 0, high-1);//进行归并排序
	for (int i = 0; i < high; i++)//将拍完序的数组进行输出
		printf("%d ", a[i]);
}

三、执行结果

在这里插入图片描述

输入:

a[] = { 4,5,6,7,8,9,1,2,3 };

输出:

1 2 3 4 5 6 7 8 9
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是C语言实现归并排序算法代码注释: ```c #include <stdio.h> /* 归并排序函数 */ void merge_sort(int arr[], int left, int right); /* 合并两个有序数组 */ void merge(int arr[], int left, int mid, int right); /* 主函数 */ int main() { int arr[] = {3, 5, 1, 2, 6, 4}; int len = sizeof(arr) / sizeof(arr[0]); // 数组长度 merge_sort(arr, 0, len - 1); // 调用归并排序 for (int i = 0; i < len; i++) { printf("%d ", arr[i]); // 输出排序后的数组 } return 0; } void merge_sort(int arr[], int left, int right) { if (left >= right) { return; // 当数组只有一个元素时,直接返回 } int mid = (left + right) / 2; // 求中间位置 merge_sort(arr, left, mid); // 对左半部分进行递归排序 merge_sort(arr, mid + 1, right); // 对右半部分进行递归排序 merge(arr, left, mid, right); // 合并左右两个有序数组 } void merge(int arr[], int left, int mid, int right) { int len = right - left + 1; int *tmp = (int*)malloc(len * sizeof(int)); // 申请临时数组 int i = left; // 左半部分数组起始位置 int j = mid + 1; // 右半部分数组起始位置 int k = 0; // 临时数组起始位置 while (i <= mid && j <= right) { if (arr[i] <= arr[j]) { tmp[k++] = arr[i++]; // 将左半部分数组元素放入临时数组中 } else { tmp[k++] = arr[j++]; // 将右半部分数组元素放入临时数组中 } } while (i <= mid) { tmp[k++] = arr[i++]; // 将剩余的左半部分数组元素放入临时数组中 } while (j <= right) { tmp[k++] = arr[j++]; // 将剩余的右半部分数组元素放入临时数组中 } for (int m = 0; m < len; m++) { arr[left + m] = tmp[m]; // 将临时数组中的元素复制回原数组中 } free(tmp); // 释放临时数组的内存空间 } ``` 代码注释: 1. `merge_sort`函数:归并排序函数,用于将数组的左半部分和右半部分进行递归排序,并将两个有序数组合并成一个有序数组。参数`arr`为要排序的数组,参数`left`为数组左边界,参数`right`为数组右边界。 2. `merge`函数:合并两个有序数组,用于将数组的左半部分和右半部分合并成一个有序数组。参数`arr`为原始数组,参数`left`为左半部分数组的起始位置,参数`mid`为左半部分数组的终止位置,参数`right`为右半部分数组的终止位置。 3. `main`函数:主函数,用于测试归并排序的效果。 4. 在`merge`函数中,首先计算出临时数组的长度,然后申请临时数组的内存空间。接着,使用双指针法将左半部分数组和右半部分数组进行合并,将合并后的有序数组存放在临时数组中。最后,将临时数组中的元素复制回原数组中,并释放临时数组的内存空间。 5. 在`merge_sort`函数中,首先判断数组是否只有一个元素,如果是,则直接返回。否则,计算出数组的中间位置`mid`,然后对数组的左半部分和右半部分进行递归排序,并将排序后的两个有序数组合并成一个有序数组。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

立志冲海大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值