首页 > 编程语言 >算法设计与分析(合并排序

算法设计与分析(合并排序

时间:2024-09-19 12:24:08浏览次数:3  
标签:归并 right int 合并 算法 数组 排序 left



目录

  • 归并排序(Merge Sort)的C++实现
  • 源代码
  • 解释
  • 结果
  • 小结:


归并排序(Merge Sort)的C++实现

归并排序是一种分而治之的算法,它将数组分成两半,对每半部分递归地应用归并排序,然后将排序好的两半合并成一个有序的数组。以下是一个归并排序的C++实现。

源代码

#include<iostream>  
  
using namespace std;  
  
// 辅助数组,用于合并两个有序数组  
int b[10];  
  
// 合并两个有序数组段到辅助数组b[]  
void Merge(int a[], int left, int i, int right){  
	int l_p = left;     // 左数组的起始位置  
	int r_p = i + 1;    // 右数组的起始位置  
	  
	int b_p = 0;        // 辅助数组b的当前位置  
	  
	// 合并两个有序数组段到b[]  
	while (l_p <= i && r_p <= right){  
		if (a[l_p] <= a[r_p]){  
			b[b_p++] = a[l_p++];  
		}  
		else{  
			b[b_p++] = a[r_p++];  
		}  
	}  
	// 将左侧剩余的元素复制到b[]  
	while (l_p <= i){  
		b[b_p++] = a[l_p++];  
	}  
	// 将右侧剩余的元素复制到b[]  
	while (r_p <= right){  
		b[b_p++] = a[r_p++];  
	}  
}  
  
// 将排序好的数组段从辅助数组b[]复制回原数组a[]  
void Copy(int a[], int left, int right) {    
    for (int i = left; i <= right; i++) {    
        a[i] = b[i - left];   
    }    
}  
  
// 归并排序函数  
void MergeSort(int a[], int left, int right){  
	if (left >= right) return;	// 如果只有一个元素,则无需排序  
	else{  
		int i = (left + right) / 2;  
		// 递归地对左半部分进行归并排序  
		MergeSort(a, left, i); 		  
		// 递归地对右半部分进行归并排序  
		MergeSort(a, i + 1, right);   
		  
		// 合并两个有序的数组段  
		Merge(a, left, i, right);  
		// 将排序好的数组段复制回原数组a[]  
		Copy(a, left, right);  
	}	  
}   
  
// 主函数  
int main() {  
	int a[10] = {5, 3, 7, 8, 4, 2, 10, 9, 1, 6};  
	MergeSort(a, 0, 9);  
	// 输出排序后的数组  
	for (int i = 0; i <= 9; i++){  
		cout << a[i] << ' ';  
	}  
	cout << endl;  
	return 0;  
}

解释

Merge 函数:该函数负责将两个已排序的数组段合并成一个有序的数组段,并存储在辅助数组 b 中。合并完成后,通过 Copy 函数将结果复制回原数组 a。

Copy 函数:用于将辅助数组 b 中的数据复制回原数组 a 的指定位置。

MergeSort 函数:这是归并排序的核心函数,采用递归的方式,将数组分成越来越小的部分,直到每个部分只有一个元素(无需排序),然后开始合并过程,直至整个数组排序完成。

main 函数:定义了一个待排序的数组 a,并调用 MergeSort 函数对其进行排序,最后输出排序后的结果。

这个实现展示了归并排序的基本思想和步骤,是理解和实现归并排序的一个很好的例子。

结果

算法设计与分析(合并排序_排序算法

标签:归并,right,int,合并,算法,数组,排序,left
From: https://blog.51cto.com/u_16672541/12055745

相关文章

  • 算法设计与分析(斐波那契数列
    目录斐波那契数列的递归实现斐波那契数列的定义递归实现注意事项小结:斐波那契数列的递归实现在编程中,斐波那契数列是一个非常著名的序列,它通常定义为每个数字(从第3个数字开始)都是前两个数字的和,且前两个数字分别是0和1。斐波那契数列的定义在本实现中,斐波那契数列的定义略有不同,......
  • 算法设计与分析(乘船问题
    目录题目描述解题思路代码实现小结:题目描述给定一批轮船,每艘轮船的最大载重量均为M,每艘船最多只允许装两个人,旅客总人数最多为50人。每个旅客的体重不同。现要求设计算法求出装走所有旅客所需轮船的最少数量。输入格式:第一行输入为每艘船的最大载重量M和旅客总人数num。第二行输......
  • 算法设计与分析(阶乘
    目录计算阶乘的递归函数阶乘函数的实现代码解释递归的优点与缺点优点:缺点:小结:计算阶乘的递归函数在编程中,阶乘是一个常见的概念,它表示从1乘到某个给定数n的所有整数的乘积。例如,5的阶乘(记作5!)是12345=120。这里,我们将通过C++语言实现一个递归函数来计算任意非负整数的阶乘。递归......
  • 算法设计与分析(二分查找算法
    目录二分查找算法详解引言算法步骤代码实现注意事项结论小结:二分查找算法详解引言二分查找算法是一种在有序数组中查找特定元素的搜索算法。它通过不断将数组分成两半,缩小搜索范围,从而快速定位到目标元素的位置。二分查找算法的时间复杂度为O(logn),其中n是数组的长度。算法步骤......
  • 分类预测 | Matlab实现SMA-CNN-SVM黏菌算法优化卷积支持向量机分类预测
    分类预测|Matlab实现SMA-CNN-SVM黏菌算法优化卷积支持向量机分类预测目录分类预测|Matlab实现SMA-CNN-SVM黏菌算法优化卷积支持向量机分类预测分类效果基本描述程序设计参考资料分类效果基本描述1.Matlab实现SMA-CNN-SVM黏菌算法优化卷积支持向量机分类预......
  • 算法学习-Dancing Links X
    DancingLinksX舞蹈链。实质为用循环十字链在图上将所有“1”的位置链起来构造较为巧妙,且极易理解,本题为DLX模板(精确覆盖问题)DLX算法的题目做法一般为将所求方案转化为行号,将限制条件转化为列号然后dfs暴力枚举,用循环十字链优化/*Finishedat12:14on2024.4.5*/#......
  • 算法学习-CDQ分治
    对于二维偏序,为普通的求逆序对,只需要先排序一遍,然后树状数组或双指针即可而三位偏序甚至更高,则需要用CDQ分治,简单来说,就是将树状数组和双指针结合操作步骤如下:1.开始将数组按第一维排序,保证满足x性质2.在归并中,将左右分别按y排序,因为开始以x排序,所以保证了正确性,保证贡献从左......
  • 【算法】堆与优先级队列
    【ps】本篇有4道 leetcode OJ。目录一、算法简介二、相关例题1)最后一块石头的重量.1-题目解析.2-代码编写2)数据流中的第K大元素.1-题目解析.2-代码编写3)前K个高频单词.1-题目解析.2-代码编写4)数据流的中位数.1-题目解析.2-代码编写 一、算......
  • 多输入多输出 | Matlab实现DBO-BP蜣螂算法优化BP神经网络多输入多输出预测
    多输入多输出|Matlab实现DBO-BP蜣螂算法优化BP神经网络多输入多输出预测目录多输入多输出|Matlab实现DBO-BP蜣螂算法优化BP神经网络多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料预测效果基本介绍多输入多输出|Matlab实现DBO-BP蜣螂算法优化BP神经网络多输入......
  • 一区霜冰算法+双向深度学习模型+注意力机制!RIME-BiTCN-BiGRU-Attention
    一区霜冰算法+双向深度学习模型+注意力机制!RIME-BiTCN-BiGRU-Attention目录一区霜冰算法+双向深度学习模型+注意力机制!RIME-BiTCN-BiGRU-Attention效果一览基本介绍程序设计参考资料效果一览基本介绍1.Matlab实现RIME-BiTCN-BiGRU-Attention霜冰算法优化双向时间卷积双向门控循环......