广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言排序算法之选择排序(直接选择排序,堆排序)
  • 355
分享到

C语言排序算法之选择排序(直接选择排序,堆排序)

2024-04-02 19:04:59 355人浏览 薄情痞子
摘要

目录前言一、直接选择排序1.1 算法思想1.2 代码实现1.3 直接选择排序的特征总结二、堆排序2.1 什么是堆?2.2 判断是否是堆2.3 向下调整算

前言

本期为大家带来的是常见排序算法中的选择排序,主要有直接选择排序以及——堆排序(有点难理解),包您一看就会,快来试试吧~

一、直接选择排序

1.1 算法思想

每一次从待排序的数据元素中选出最小(或最大的)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

在元素集合a[i]--a[n-1]中选择关键码最大(小)的数据元素 若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个) 元素交换 在剩余的 [a[i] , a[n-2] …… [a[i+1],a[n-1] ]集合中,重复上述步骤,直到集合剩 余1个元素。

我们拿一组实例来感受一下,直接选择排序是怎么运算的:

1.2 代码实现

给大家带来一个优化版本的直接选择排序,一次遍历,选出最大数和最小数,然后交换,相较于传统的,效率高了许多。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
 
//交换
void Swap(int* mini, int* maxi)
{
	int tmp = *mini;
	*mini = *maxi;
	*maxi = tmp;
}
 
//打印
void Print(int* a, int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}
}
 
//直接选择排序
void SelectSort(int *a,int n)
{
	//下标
	int begin = 0;
	int end = n - 1;
	while (begin < end)
	{
		int mini = begin, maxi = end;
		//选出最大的给maxi,选出最小的给mini
		for (int i=begin;i<=end;++i)
		{
			if (a[i]>a[mini])//升序
			{
				mini = i;   //改两个if的符号即可实现升序、降序转换。
			}
			if (a[i] <a[maxi])
			{
				maxi = i;
			}
		}
		//交换
		Swap(&a[begin],&a[mini]);
        //因为还有一种特殊情况,就是begin跟maxi重叠,然后执行第一次交换之后,maxi记录的是最小值
        if (begin == maxi)
		{
			maxi = mini;
		}
		Swap(&a[end], &a[maxi]);
		++begin;
		--end;
	}
}
直接选择排序
//void SelectSort(int* a, int n)//(升序)
//{
//	for (int j=0;j<n-1;j++)//整体遍历
//	{
//		for (int i=j+1;i<n;i++)//遍历比较
//		{
//			if (a[j] > a[i])//比较交换
//			{
//				int tmp = a[j];
//				a[j] = a[i];
//				a[i] = tmp;
//			}
//		}
//	}
//}
int main()
{
	int a[10] = { 3,5,9,7,4,2,1,6,0,8 };
	SelectSort(a, sizeof(a) / sizeof(a[0]));
	//打印
	Print(a, sizeof(a) / sizeof(a[0]));
	return 0;
}

1.3 直接选择排序的特征总结

  • 1.直接选择排序的算法非常好理解,但是效率不高,实际中也很少使用
  • 2.时间复杂度:O(N^2) ,直接选择排序不管数据的顺序如何,都要遍历至结束
  • 3.空间复杂度:O(1)
  • 4.稳定性:不稳定

二、堆排序

2.1 什么是堆?

2.2 判断是否是堆

我们在给到一个数组的时候,里面的数据往往不是“堆”,我们在使用堆排序的时候,就需要建堆,

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种的排序算法,它是选择排序的一种,利用堆来进行选择数据。跟着我一起看看具体是怎么操作的。

建小堆排降序,建大堆排升序。

怎样建堆呢?这里我们的前辈就设计了一种算法

2.3 向下调整算法

 堆排序的本质是选择排序

向下调整算法,如果是建小堆(排降序),前提:左右子树都是小堆。大堆就是反着来。

从根节点开始,选出左右孩子中小的那一个跟父亲比较,如果比父亲小就交换,然后继续往下调整,调整到叶子节点就停止。

2.4 自底向上的建堆方式

这种建堆方式是从倒数第二层的节点(叶子节点的上一层)开始,从右往左,从下到上的向下进行调整。

2.5 代码实现

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//打印数据
void Printf(int* a, int n)
{
	for (int i = 0; i < n; ++i)
	{
		printf("%d ", a[i]);
	}
}
 
//交换,传地址
void Swap(int* child, int* parent)
{
	int tmp = *child;
	*child = *parent;
	*parent = tmp;
}
//向下调整算法
//从根节点开始,如果是建立小堆选出左右孩子中小的那一个,跟父亲比较,如果比父亲小就交换
void AdjustDwon(int* a, int n, int root)//建小堆
{
	int parent = root;//父亲节点
	int child = parent * 2 + 1;//默认是左孩子
	while (child < n)//叶子节点下标不会超过数组总下标数n
	{
		//选出左右孩子中最小的那一个
		if (child+1 < n&& a[child + 1] < a[child])
		{
			child += 1;//用a[child]与父亲节点a[parent]比较
		}
		if (a[child] < a[parent])
		{
			//交换,传地址
			Swap(&a[child], &a[parent]);
			//交换后,将child,作为根节点继续向下调整,持续建堆
			parent = child;
			//新的左孩子
			child = parent * 2 + 1;
		}
		else
		{
			break;//如果不用交换,直接结束循环
		}
	}
}
//堆的建立
//大堆要求:树中所有的父亲都>=孩子,根是最大的
//小堆要求:书中所有的父亲都<=孩子,根是最小的
//建大堆排升序,建小堆排降序
//建堆的时间复杂度是O(N);
void HeapSort(int *a,int n)
{
	//找父亲节点
	for (int i=(n-1-1)/2;i>=0;--i)
	{
		//向下调整算法
		AdjustDwon(a,n,i);
	}
    //大堆或小堆建立完毕,排序
	//用主根节点与最后一个节点交换位置
	int end = n - 1;
	while (end>0)
	{
		//交换,传地址
		Swap(&a[0],&a[end]);
		//继续向下调整
		AdjustDwon(a,end,0);
		--end;
	}
}
//选择排序—堆排序
int main()
{
	int a[10] = {9,2,5,4,3,1,6,7,8,0};
	//堆的建立
	HeapSort(a,sizeof(a) / sizeof(a[0]));
	//打印数据
	Printf(a,sizeof(a) / sizeof(a[0]));
	return 0;
}

2.6 堆排序的特性总结

  • 1.堆排序使用堆来选数,效率高很多
  • 2.时间复杂度:O(N*logN)
  • 3.空间复杂度:O(1)
  • 4.稳定性:不稳定

2.7 堆排序的特性总结

  • 1.堆排序使用堆来选数,效率高很多
  • 2.时间复杂度:O(N*logN)
  • 3.空间复杂度:O(1)
  • 4.稳定性:不稳定

到此这篇关于C语言排序算法之选择排序(直接选择排序,堆排序)的文章就介绍到这了,更多相关C语言选择排序 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言排序算法之选择排序(直接选择排序,堆排序)

本文链接: https://www.lsjlt.com/news/164205.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言排序算法之选择排序(直接选择排序,堆排序)
    目录前言一、直接选择排序1.1 算法思想1.2 代码实现1.3 直接选择排序的特征总结二、堆排序2.1 什么是堆?2.2 判断是否是堆2.3 向下调整算...
    99+
    2022-11-13
  • python排序算法之选择排序
    一、前言 相关知识来自《python算法设计与分析》。初级排序算法是指几种较为基础且容易理解的排序算法。初级排序算法包括插入排序、选择排序和冒泡排序3种。虽然它们的效率相对于高级排序...
    99+
    2023-05-17
    python排序算法 python选择排序
  • java 排序算法之选择排序
    目录基本介绍基本思想思路分析代码实现演变过程优化算法函数封装大量数据耗时测试基本介绍 选择排序(select sorting)也属于内部排序法,是从欲排序的数据中,按指定的规则选出来...
    99+
    2022-11-12
  • Java排序算法之选择排序
    目录一、选择排序二、代码实现三、测试一、选择排序 选择排序就是在每一次遍历过程中将数组中值最小的排到当前的第一位。 总共需要(数组长度-1)次遍历,在每次遍历中假定第一位索引的值为最...
    99+
    2022-11-12
  • Python排序算法之 选择排序
      一、选择排序(Selection sort)  选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,所以称为:选择排序。  1、原...
    99+
    2023-06-02
  • C#算法之冒泡排序、插入排序、选择排序
    冒泡排序法 是数组等线性排列的数字从大到小或从小到大排序。 以从小到大排序为例。 数据 11, 35, 39, 30, 7, 36, 22, 13, 1, 38, 26, 18, 1...
    99+
    2022-11-12
  • C语言排序之 堆排序
    目录前言:完全二叉树在数组中下标换算公式代码工作流程整体流程重建堆函数流程大小顶堆使用场景时间复杂度代码前言: 堆是具有以下性质的完全二叉树 每个节点大于或等于其左右子节点,此时称为...
    99+
    2022-11-13
  • java排序算法之选择排序详解
    本文实例为大家分享了java排序算法之选择排序的具体代码,供大家参考,具体内容如下 选择排序 选择排序的思路是这样的:首先,找到数组中最小的元素,拎出来,将它和数组的第一个元素交换位...
    99+
    2022-11-12
  • 排序算法图解之Java选择排序
    目录1.选择排序简介2.图解选择排序算法3.选择排序代码实现1.选择排序简介 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元...
    99+
    2022-11-13
    Java选择排序 Java 排序
  • 数据结构:直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序,计数排序(C实现)
    个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》 文章目录 前言一、插入排序1.直接插入排序2.希尔排序 二、选择排序1. 选择排序2.堆排序 三、交换排序1.冒...
    99+
    2023-09-14
    数据结构 c语言 排序算法
  • C语言常见排序算法之插入排序(直接插入排序,希尔排序)
    目录前言一、直接插入排序1.1 基本思想1.2 算法思想1.3 程序实现1.4 直接插入排序的总结二、希尔排序2.1 算法思想2.2 程序实现2.3 希尔排序的特征总结前言...
    99+
    2022-11-13
  • 【数据结构】选择排序 & 堆排序(二)
    目录 一,选择排序 1,基本思想 2, 基本思路 3,思路实现 二,堆排序 1,直接选择排序的特性总结: 2,思路实现 3,源代码 最后祝大家国庆快乐! 一,选择排序 1,基本思想 每一次从待排序的数据元素中选出最小(或最大)的一个...
    99+
    2023-10-18
    排序算法 算法 数据结构 c语言 开发语言
  • C语言八大排序之堆排序
    目录前言一、堆排序的概念二、堆排序的实现第一步:构建堆第二步:排序三、完整代码四、证明建堆的时间复杂度 前言 本章我们来讲解八大排序之堆排序。2022,地球Online新赛季开始了!...
    99+
    2022-11-13
  • Java 十大排序算法之选择排序刨析
    目录选择排序原理选择排序API设计选择排序代码实现选择排序的时间复杂度选择排序原理 ①假设第一个索引处的元素为最小值,和其他值进行比较,如果当前的索引处的元素大于其他某个索引处的值,...
    99+
    2022-11-12
  • JAVA十大排序算法之选择排序详解
    目录选择排序代码实现动图演示代码实现时间复杂度算法稳定性总结选择排序 1.找到数组中最大(或最小)的元素 2.将它和数组的第一个元素交换位置(如果第一个元素就是最大(小)元素那么它就...
    99+
    2022-11-12
  • python排序算法之选择排序怎么实现
    一、前言初级排序算法是指几种较为基础且容易理解的排序算法。初级排序算法包括插入排序、选择排序和冒泡排序3种。虽然它们的效率相对于高级排序算法偏低,但是在了解初级排序算法之后,再去学习相对复杂的高级排序算法会容易许多。二、描述选择排序表示从无...
    99+
    2023-05-17
    Python
  • java排序算法之_选择排序(实例讲解)
    选择排序是一种非常简单的排序算法,从字面意思我们就可以知道,选择就是从未排序好的序列中选择出最小(最大)的元素,然后与第 i 趟排序的第 i-1(数组中下标从 0 开始) 个位置的元素进行交换,第 i 个元素之前的序列就是已经排序好的序列。...
    99+
    2023-05-31
    java 选择排序 算法
  • 20190426-选择排序算法
    它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。 算法: step1:先写算法...
    99+
    2023-01-31
    算法
  • C#算法中如何实现冒泡排序、插入排序、选择排序
    这篇文章主要介绍了C#算法中如何实现冒泡排序、插入排序、选择排序,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。冒泡排序法是数组等线性排列的数字从大到小或从小到大排序。以从小到...
    99+
    2023-06-26
  • Python 选择排序中的树形选择排序
    目录1、引言2、问题描述3、解决方案4、结语1、引言 选择排序里面主要讲了三个排序,分别是简单选择排序、树形选择排序、堆排序。今天这篇文章主要讲树形选择排序,树形选择排序也被称为锦标...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作