数据结构-选择排序(简单选择、堆)

简单选择排序

基本思想

非常基础的算法,假设有N个数据,比较N-1轮,每轮选出当前剩余数据的最大(最小)放到数据

的开头,之后重复即可获得答案。

示例

代码

void SelectSort(OrderList *L)
{RecordType tmp;int i,j,min;for(i=1;i<=L->length-1;i++){min = i;for(j=i+1;j<=L->length;j++){if(L->data[j].key < L->data[min].key){min = j;}}if(min!=i){tmp = L->data[min];L->data[min] = L->data[i];L->data[i] = tmp;}}
}

堆排序

堆的概念

若有n个记录组成的序列{n1,n2,n3,.....n}

满足如下关系的时候,称作“堆”:

若将该序列换为完全二叉树,则我们可以得到一个:“非终端结点的值均小于其左右孩子,即根节

点最小”,这种特征的一个完全二叉树。

因此,若序列是堆,那么堆顶元素(完全二叉树的根节点)必定是这n个元素中的最小值 

基本思想

1.我们需要先将一个无序序列排成一个:“小根堆”。(所有非终端结点均小于其左右孩子)。

我们还知道一颗完全二叉树的非终端结点的最后一个节点的序号一定为[n/2](向下取整)。

因此,我们可以先对前[n/2]个结点依次进行根排序,就可以得到一个:“小根堆”。

2.此时我们将堆顶元素根堆底元素交换,再将堆顶元素进行堆排序,再把排序后的堆顶元素与堆底

元素交换。如此重复,直到只剩余一个元素没有进行顶底交换为止。

代码

void HeapAdjust(OrderList *L,int m,int n)		//堆排序 
{							//在函数中,默认m结点是没有堆排序的,但是[m+1,n]结点已经堆排序 RecordType tmp;int i;tmp = L->data[m];for(i=2*m;i<=n;i*=2){		//每次乘2,因为仿照完全二叉树 if(i<n&&L->data[i].key>L->data[i+1].key)	//i永远存储统一左右孩子中较小的孩子索引 i++;if(tmp.key<L->data[i].key)			//tmp小于最小的孩子,说明排序完成 break;L->data[m] = L->data[i];		//交换当前层次的最小结点 m = i;		//m是i的父节点 }L->data[m] = tmp;		//成功交换 
}void HeapSort(OrderList *L)		//堆顶与堆底元素交换(元素输出) 
{RecordType tmp;int i;for(i=L->length/2;i>0;i--)		//对前[n/2]非终端结点进行堆排序,形成一个"小根堆" HeapAdjust(L,i,L->length);for(i=L->length;i>1;i--){		//堆顶与堆底结点交换 tmp = L->data[1];L->data[1] = L->data[i];L->data[i] = tmp;HeapAdjust(L,1,i-1);	//重新对剩余的结点进行堆排序 }
}

总代码

#include<stdio.h>
#define MAX 100
typedef int KeyType;
typedef struct{KeyType key;
}RecordType;
typedef struct{RecordType data[MAX];int length;
}OrderList;void SelectSort(OrderList *L)
{RecordType tmp;int i,j,min;for(i=1;i<=L->length-1;i++){min = i;for(j=i+1;j<=L->length;j++){if(L->data[j].key < L->data[min].key){min = j;}}if(min!=i){tmp = L->data[min];L->data[min] = L->data[i];L->data[i] = tmp;}}
}void HeapAdjust(OrderList *L,int m,int n)		//堆排序 
{							//在函数中,默认m结点是没有堆排序的,但是[m+1,n]结点已经堆排序 RecordType tmp;int i;tmp = L->data[m];for(i=2*m;i<=n;i*=2){		//每次乘2,因为仿照完全二叉树 if(i<n&&L->data[i].key>L->data[i+1].key)	//i永远存储统一左右孩子中较小的孩子索引 i++;if(tmp.key<L->data[i].key)			//tmp小于最小的孩子,说明排序完成 break;L->data[m] = L->data[i];		//交换当前层次的最小结点 m = i;		//m是i的父节点 }L->data[m] = tmp;		//成功交换 
}void HeapSort(OrderList *L)		//堆顶与堆底元素交换(元素输出) 
{RecordType tmp;int i;for(i=L->length/2;i>0;i--)		//对前[n/2]非终端结点进行堆排序,形成一个"小根堆" HeapAdjust(L,i,L->length);for(i=L->length;i>1;i--){		//堆顶与堆底结点交换 tmp = L->data[1];L->data[1] = L->data[i];L->data[i] = tmp;HeapAdjust(L,1,i-1);	//重新对剩余的结点进行堆排序 }
}int main()
{int sample[11]={0,6,9,11,2,100,66,55,9,101,1000};int i;OrderList L;L.length = 10;for(i=1;i<=L.length;i++)L.data[i].key = sample[i];//SelectSort(&L);//HeapSort(&L);for(i=1;i<=L.length;i++)printf("%d ",L.data[i].key);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/230788.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tcp/ip协议 error=10022 Winsock.reg Winsock2.reg

tcp/ip协议 error10022 这2个注册表选项千万不能删除&#xff0c;否则上不了网。 按下windows键R键&#xff0c;输入regedit&#xff0c;打开注册表&#xff0c;在文件目录里找到如下两个文件夹&#xff0c;删除这两个文件夹。 路径&#xff1a;HKEY_LOCAL_MACHINE\System\C…

Abaqus飞机起落架扭力臂拓扑优化

Abaqus飞机起落架扭力臂拓扑优化 Abaqus除了可以对结构进行强度分析&#xff0c;同样也自带强大的优化功能&#xff0c;下面通过一个简 单的实例演示在Abaqus中进行拓扑优化&#xff0c;另外&#xff0c;如果需要更加强大的拓扑优化仿真&#xff0c;可以 在TOSCA中进行。 定义接…

基于Qt QChart和QChartView实现正弦、余弦、正切图表

# 源码地址 https://gitcode.com/m0_45463480/QChartView/tree/main# .pro QT += charts​​HEADERS += \ chart.h \ chartview.h​​SOURCES += \ main.cpp \ chart.cpp \ chartview.cpp​​target.path = $$[QT_INSTALL_EXAMPLES]/charts/zoomlinechartINSTAL…

Flutter创建TabBar

使用TabBar和TabBarView来创建一个包含"首页"、"分类"和"我的"的TabBar。每个Tab对应一个Tab控件&#xff0c;TabBarView中的每个页面对应一个Widget。 1.Tab使用自定义图标和颜色 一般UI设计的图会带渐变色之类的&#xff0c;应该保持图片的原…

单相直流电表和单相智能电表有哪些区别?

在众多的智能电表中&#xff0c;单相智能电表已成为家庭用电、工业用电等领域的重要组成部分。与此同时&#xff0c;单相直流电表也因其特性在某些特定场合受到关注。下面就来讲讲两者都有哪些区别&#xff0c;一起来看下吧&#xff01; 一、工作原理及性能差异 1.单相直流电表…

数据标注需要注意的问题

在进行数据标注时&#xff0c;有一些重要的问题需要注意&#xff0c;以确保标注的数据质量和可用性。以下是一些建议和注意事项&#xff1a; 明确定义标签&#xff1a; 确保标签的含义和定义是清晰明确的。标签是对数据的关键描述&#xff0c;因此其含义应该在整个团队中共享和…

并查集带权并查集

定义 : 并查集 : 一种数据结构&#xff0c;用于处理一些不相交集合的合并与查询问题&#xff1b; 例题 : 如 : 有n种元素&#xff0c;分属于不同的n个集合&#xff1b; 有两种操作 : 1.给出两个元素的亲属关系&#xff0c;合并两个集合(x与y是亲戚&#xff0c;亲戚的亲戚…

调研活动怎么做_及时掌握市场趋势

标题&#xff1a;掌握市场趋势&#xff0c;开启调研之旅 一、调研活动的重要性 在当今竞争激烈的市场环境中&#xff0c;了解市场趋势和客户需求至关重要。通过开展有效的调研活动&#xff0c;企业可以获取准确的市场信息和用户反馈&#xff0c;为产品研发、市场营销和战略规…

AKConv:具有任意采样形状和任意数目参数的卷积核

文章目录 摘要1、引言2、相关工作3、方法3.1、定义初始采样位置3.2、可变卷积操作3.3、扩展AKConv3.3、扩展AKConv 4、实验4.1、在COCO2017上的目标检测实验4.2、在VOC 712上的目标检测实验4.3、在VisDrone-DET2021上的目标检测实验4.4、比较实验4.5、探索初始采样形状 5、分析…

L1-003:个位数统计

题目描述 给定一个 k 位整数 Ndk−1​10k−1⋯d1​101d0​ (0≤di​≤9, i0,⋯,k−1, dk−1​>0)&#xff0c;请编写程序统计每种不同的个位数字出现的次数。例如&#xff1a;给定 N100311&#xff0c;则有 2 个 0&#xff0c;3 个 1&#xff0c;和 1 个 3。 输入格式&#…

序列号管理

序列号管理&#xff0c;将从以下方面进行学习和阐述 WHY 为什么需要序列号&#xff0c;有什么作用 HOW sap如何进行管理序列号 WHEN 什么情况下适合进行序列号管理 1、 什么是序列号 首先简单介绍一个序列号是什么东西&#xff0c;我们使用的手机、电脑或者大家…

Element的安装与基本使用

文章目录 一.什么是Element?二.Element的安装(Vscode)三.在Vue项目中引入ElementUI组件库四.编写Element的Vue组件文件五.演示如何使用Element官网中的组件根组件中引入Element组件内容进行网页展示 一.什么是Element? Element是饿了么团队研发的一套为开发者与设计师等准备…