MergeSort 归并排序(C语言)---人工智能导论

本文详细介绍了归并排序(MergeSort)的原理和过程,包括如何将数组分割并进行有序合并。通过示例代码展示了如何用C++实现归并排序,最终达到对数组进行升序排列的目的。归并排序是一种稳定的排序算法,适用于大规模数据的排序。

MergeSort(归并排序)—人工智能导论

1.MergeSort原理

mergeSort的准备是sort,关键是 merge

如何归并排序?它是分两步走的。

首先要把所给的数组分割开来,然后对分割开来的子数组进行合并。

看图比较容易理解:
在这里插入图片描述

2.MergeSort过程分析

经过我们的演示可以发现,我们的合并是沿着当初分割的原路合并的,在合并的时候将元素的大小顺序排好。

1.$\textcolor{mediumorchid}{拆分} $ 将数组从中间分开得到新的两子数组,对子数组重复进行分割操作,把一整个数组通过递归的方法分成1/2、1/4、1/8 … 直到把数组分成许多个元素为1的子数组块。然后原路返回进行合并操作。

2.$\textcolor{ForestGreen}{归并} $ 当需要合并的两个子数组都只有一个元素时,比较大小,谁小谁在前,谁大谁在后,按照小在前大在后的顺序加入到临时数组中。
当需要合并的两个子数组元素大于1 时,假如两个子数组为left[i] 、 right[j],先使用两个数组的第一个元素比较大小,例如left[0]和right[0]比较大小,如果left[0]<right[0],先则把left[0]为加入到临时数组中;left[1]再和right[0]比较大小。如此进行下去。
如过left[] 的元素已经全部假如新的数组,而right[]还没有全部假如新数组,则之间将right[]的剩余元素按其本身的顺序关系添加到新数组后面即可,反之同理。

3.重复合并操作,直至重新生成的数组和数组大小一样,MergeSort结束。

3.代码实现

#include<bits/stdc++.h>
using namespace std;
int MAXSIZE=15;
//归并 
void merging(int *list1,int list1_size,int *list2,int list2_size ){
	int tmp[MAXSIZE];
	int i,j,k;
	i=j=k=0;
	while(i < list1_size && j < list2_size){
		if(list1[i] < list2[j]){
			tmp[k++] = list1[i++];
		}
		else{
			tmp[k++] = list2[j++];
		}
	} 
	// 如果比较的连个子数组中一个已经为空,另一个还有剩余元素,则直接追加到合并数组的后面
	while(i < list1_size){
		tmp[k++]=list1[i++];
	}
	while(j < list2_size){
		tmp[k++]=list2[j++];
	}
	for(int n = 0;n < (list1_size+list2_size);n++){
		list1[n] = tmp[n];
	}   
}
//拆分 
void mergesort(int arr[],int n){
	if(n>1){
		int *list1 = arr; // 指针指向左边子数组的第一个元素 
		int list1_size = n/2;
		int *list2 = arr+list1_size; // 指针指向右边边子数组的第一个元素 
		int list2_size = n-list1_size;
		//拆分 
		mergesort(list1,list1_size); // 对左半边数组继续做拆分 
		mergesort(list2,list2_size);// 对左半边数组继续做拆分 
		//归并 
		merging(list1,list1_size,list2,list2_size); // 对分开的数组进行合并操作
	}
}
int main(){
	int a[10]={1,3,6,8,0,9,4,2,5,7};
	printf("perpare sort array is "); 
	for(int i = 0;i < 10;i++){
		printf("%d ",a[i]); // 1 3 6 8 0 9 4 2 5 7
	}
	printf("\n");
	mergesort(a,10);
	printf("MergeSorted array is ");
	for(int i = 0;i < 10;i++){
		printf("%d ",a[i]); // 0 1 2 3 4 5 6 7 8 9
	}
}
### C语言实现归并排序 #### 归并排序简介 归并排序是一种基于分治法的高效稳定排序算法。其基本原理是将待排序序列分解为若干个子序列,直到每个子序列只有一个元素为止;然后逐步合并这些子序列,最终得到完整的有序序列。 #### 代码实现细节 在 `mergeSort` 函数中实现了核心逻辑,该函数负责递归地分割数组直至最小单元,并通过调用辅助函数 `merge` 来完成实际的数据合并操作[^1]。 ```c #include <stdio.h> #include <stdlib.h> // 合并两个已经排好序的区间 [left, mid] 和 [mid+1, right] void merge(int *arr, int left, int mid, int right) { int n1 = mid - left + 1; int n2 = right - mid; // 创建临时数组存储左右半区间的副本 int L[n1], R[n2]; for (int i = 0; i < n1; ++i) L[i] = arr[left + i]; for (int j = 0; j < n2; ++j) R[j] = arr[mid + 1 + j]; // 初始化索引变量 int 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) return; int mid = left + (right - left) / 2; // 递归对两侧分别排序 mergeSort(arr, left, mid); mergeSort(arr, mid + 1, right); // 排序完成后合并结果 merge(arr, left, mid, right); } ``` 为了验证上述实现的有效性,在主程序部分可以加入如下测试代码: ```c int main() { int data[] = {38, 27, 43, 3, 9, 82, 10}; int length = sizeof(data)/sizeof(*data); printf("Original array:\n"); for (int i = 0; i < length; ++i) printf("%d ", data[i]); putchar('\n'); // 调用归并排序方法 mergeSort(data, 0, length - 1); printf("Sorted array:\n"); for (int i = 0; i < length; ++i) printf("%d ", data[i]); return EXIT_SUCCESS; } ``` 此段代码展示了如何定义一个简单的整型数组作为输入样本,并打印排序前后的状态以便观察效果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值