排序算法之选择排序

选择排序:每一趟在n-i+1个有数据中选取最大(小)的数据,作为有序数组的第i个元素。
直接选择排序:

  • 在元素集合array[i]~array[j]中选择关键码最小的元素
  • 若他不是这组元素中的第一个元素,就将它与这组元素中的第一个元素交换
  • 在剩余的array[i+1]~array[n-1]集合中,重复以上步骤,直到结合只剩下一个元素,排序完成

代码实现:

void SelectSort(int array[], int size){
	int min;//记录最小元素的下标
	for (int i = 0; i < size - 1; i++){
		min = i;
		for (int j = i + 1; j < size; j++){
			if (array[j] < array[min]){
				min = j;
			}
		}
		if (i != min){
			int k = array[i];
			array[i] = array[min];
			array[min] = k;
		}
	}
	Print(array, size);
}

总结:

  • 时间复杂度:O(N^2)
  • 稳定性:不稳定

堆排序:
堆排序是利用堆积树这种数据机构所设计的一种排序算法,它是通过堆来进行选择数据,需要注意的是排升序建大堆,排降序建小堆。
堆的逻辑结构就是一个完全二叉树,存储结构是一个一维数组,数组中的每一个元素满足

//小堆
array[i]<=array[i*2+1];
array[i]<=array[i*2+2];
//或
//大堆
array[i]>=array[i*2+1];
array[i]>=array[i*2+2];

节点node的左节点的数组下标是node2+1,右节点的数组下标是node2+2,根节点的数组下标为0。

处理一个待排序的序列,用堆排序进行排序分为以下几步:
1.建堆升序建大堆,降序建立小堆。

建大堆只能将待排序列中的最大值放在跟节点,小堆反之。

 void GreateHeap(int array[], int size){
	for (int i = (size - 2) / 2; i >= 0; i--){
		AdjustDown(array, size, i);
	}
}
 void AdjustDown(int array[], int size, int root){

	int i = 2 * root + 1;
	int j = 2 * root + 2;

	if (i >= size){
		return;
	}

	int m = i;
	if ( j<size && array[j]>array[i])
		m = j;

	if (array[m] > array[root]){
		Swap(array + m, array + root);
		AdjustDown(array, size, m);
	}
}

2.经过一次建堆操作,找出了最大数,将这个最大的数交换到待排序列的最后位置,然后再对这个待排序列除去交换到最后位置的哪个元素再进行建堆操作,确认新的最值,然后再将新确认的最值和新的序列的最后一位元素继续交换,重复以上操作,直到新的待排序列只剩下一个元素,得到的序列就是升序(降序)的。

void HeapSort(int array[], int size){
	GreateHeap(array, size);
	for (int i = 0; i < size; i++){
		Swap(array, array + size - i - 1);
		AdjustDown(array, size-1 - i, 0);
	}
	
}

总结:
时间复杂度:O(N*logN)
空间复杂度:O(1)
稳定性:不稳定

【MATLAB源程序代码合集】: 基于仿射变换的数字图象置乱技术 MATLAB源程序代码.rar 拉格朗日插值 MATLAB源程序代码.rar 蒙特卡洛法求椭圆面积的 MATLAB源程序代码.rar 牛顿(Newton)插值MATLAB源程序代码.rar 杨氏双孔干涉实验的计算机模拟源程序代码.rar MATLAB DCT水印源程序代码.ra 图形界面实现动态画图曲线的源程序代码.rar MATLAB符号计算实例 函数的最值点渐近线拐点 源程序.rar 光通过三棱镜色散动画。rar 绘制维维安尼(Viviani)曲线源代码程序。ra MATLAB绘制分子结构 源程序代码.rar 霍夫曼编码译码gui界面设计源程序代码.rar MATLAB计算粒子速度分布 源程序代码.ra 建模人口增长模型源程序代码.rar MATLAB拟合求解圆心和半径 源程序代码.rar MATLAB牛顿法求解非线性方程组 源程序代码.rar 求解非线性方程组源程序代码.rar MATLAB求解非线性最小二乘法拟合问题 源程序代码.rar 求解混沌系统微分方程组。rar MATLAB求解矩阵的特征值 源程序代码.ral 求解偏微分方程(扩散方程)有限差分法源程序代码.rar MATLAB求解无穷区间定积分问题 源程序代码.rar MATLAB 三次样条插值法 求信号的包络线 源代码.ra MATLAB设计的简单滤波器程序源代码.rar 生成gif图片程序源代码.rar MATLAB实现不同插值方法的gui界面设计源程序代码.rar MATLAB实现单摆在外力矩作用下的动画 源程序代码.ra MATLAB实现股票价格预测 源程序代码.rar .......
内容概要:本文介绍了利用遗传算法在MATLAB中实现热电联产(CCHP)系统的选址和容量规划的方法。热电联产项目涉及多个复杂因素,如燃料成本、运营成本、环境影响及电网和热网的承载能力。传统的选址定容方法难以全面考虑这些因素,而遗传算法因其全局优化能力和适应性强的特点,成为解决此类问题的有效手段。文中详细阐述了遗传算法的基本原理、程序结构与功能,包括参数设置、适应度函数设计、染色体编码与解码、遗传操作等,并提供了具体的MATLAB代码实现。此外,还讨论了适应度函数中对建设成本、热网和电网潮流计算的处理,以及交叉算子的自适应调整策略。最终,通过实际案例验证了该方法的有效性,相比传统方法,能够显著降低初期投入并优化资源配置。 适合人群:从事热电联产系统研究、设计和优化的专业人士,以及对遗传算法及其应用感兴趣的科研人员和技术开发者。 使用场景及目标:适用于需要进行热电联产项目选址和容量规划的实际工程场景,旨在寻找最优解决方案,降低成本,提高系统效率。同时,也为相关领域的研究人员提供了一种有效的优化方法。 其他说明:文中提供的MATLAB代码可以直接用于类似项目的仿真和优化,但需要注意根据实际情况调整参数和适应度函数。此外,文中提到的一些特殊处理方法,如自适应交叉算子和粒子群优化辅助搜索,有助于提高算法性能和收敛速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值