IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 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
	}
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:55:08  更:2022-02-26 11:55:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 16:33:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码