排序算法第二辑——选择排序

news2024/12/23 17:03:41

一,选择排序

选择排序算是简单排序中的渣渣,这种算法基本上是没有什么用处的。但是作为一个初学者,我又必须要会写这种算法。这种算法的实现实现思想和它的名字一样,就是在一个范围内选择最大或者最小的数据然后再交换数据实现排序。比如我有如下数据需要排序:

将数据具象化以后变成这样:

 现在我们可以选择的范围是哪些呢?

范围:  begin:0                    end:n-1。

 

 然后我们要在这个范围内选择最大的数据或者最小的数据与尾/首的数据进行交换,再将选择范围缩小:

先设置begin的后一个为最小值,end的前一个为最大值然后遍历调整得到真的最大和最小值的下标。然后将最小值和begin指向的位置交换,最大值和end指向的下标的值交换。用这个逻辑不断地走,不断地缩小查找范围,当查找范围没了(即end>=begin不再成立)以后排序就完成了。

代码:

void swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}
void selectSort(int* a, int n)
{   
    //初始的查找范围
	int end = n - 1;
	int begin = 0;
    //while循环判断查找空间是否还有
	while (begin <= end)
	{  
       //实现交换逻辑
	   int maxi = end-1;
	   int mini = begin+1;
		for (int i = begin;i <= end;i++)
		{
			if (a[i] > a[maxi])
			{
				maxi = i;
			}
			if (a[i] < a[mini])
			{
				mini = i;
			}
		}
		swap(&a[maxi], &a[end]);
        //处理特殊情况:当mini与end指向同一数据时需要处理一下
		if (mini == end)
		{
			mini = maxi;
		}
		swap(&a[mini], &a[begin]);
        //缩小查找范围
		end--;
		begin++;
	}

}

 二,堆排序

堆排序,也是选择排序的一种。但是堆排序的速度比原始的选择排序快多了。

比如下面的数据:

如果使用堆排序的话就要先将这些数据看成满二叉树的结构:

然后就要建堆了:

建堆原则:排升序建大堆,排降序建小堆。

建堆(排升序)变成这样:

 建堆完成以后便要执行下面的操作:

1.交换首尾数据。

2.缩小范围。

3.向下调整。

经过这几步以后堆排序就写好了。

堆排序代码:

void AdjustDown(int* a, int n,int parent)
{
	int child = 2 * parent + 1;
	while (child < n)
	{

		if (child + 1 < n && a[child + 1] > a[child])
		{
			child++;
		}

		if (a[child] > a[parent])
		{
			swap(&a[parent], &a[child]);
		}
		parent = child;
		child = parent * 2 + 1;
   }

 }
void heapSort(int* a, int n)
{
	//向下调整建堆
	for (int i = (n - 1 - 1) / 2;i >= 0;i--)
	{
		AdjustDown(a, n,i);
	}

	int end = n - 1;
	for (int i = end; i > 0;i--)
	{   //交换首尾数据
		swap(&a[end], &a[0]);
		//向下调整
		AdjustDown(a, end, 0);
		//缩小调整范围
		end--;
	}
}

 三,性能比较

堆排序是一个很好的算法,选择排序是一个很慢的算法。但是口说无凭,现在就写一段代码来验证这个事实。

代码:

void test()
{   //创建两个数组并将两个数组内的数据搞成随机值
	srand(time(0));
	int n = 100000;
	int* a1 = (int*)malloc(sizeof(int) * n);
	int* a2 = (int*)malloc(sizeof(int) * n);
	int i = 0;
	for ( i = 0;i < n;i++)
	{
		int j = rand();
		a1[i] = j;
		a2[i] = a1[i];
	}
    //记录选择排序的时间
	int begin1 = clock();
	selectSort(a1, n);
	int end1 = clock();

    //记录堆排序的时间
	int begin2 = clock();
	heapSort(a2, n);
	int end2 = clock();
  
    //打印两个排序的时间
	printf("selectSort:%d\n", end1 - begin1);
	printf("heapSort:%d\n", end2 - begin2);
    
   //释放内存
   free(a1);
   free(a2);
}

排十万个数据的时间:单位(ms)

selectSort:5051
heapSort:30

从结果可以看到堆排序的效率暴打选择排序。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

山西电力市场日前价格预测【2023-07-13】

日前价格预测 预测明日&#xff08;2023-07-13&#xff09;山西电力市场全天平均日前电价为342.42元/MWh。其中&#xff0c;最高日前电价为403.93元/MWh&#xff0c;预计出现在00: 15。最低日前电价为282.08元/MWh&#xff0c;预计出现在24: 00。 价差方向预测 1&#xff1a;实…

为什么大部分游戏公司仍在坚持使用SVN?

游戏开发是一个复杂的过程&#xff0c;涉及多个开发人员的协作和大量的代码、艺术资源以及其他项目文件。版本控制系统在游戏开发中起着至关重要的作用。它提供了对项目代码和文件的管理、跟踪和协作能力&#xff0c;对于保持项目的稳定性、团队协作的顺畅性以及追踪项目历史和…

《微服务架构设计模式》第七章 在微服务架构中实现查询

内容总结自《微服务架构设计模式》 在微服务架构中实现查询 一、使用API组合模式查询1、简介2、设计形式3、弊端 二、使用CQRS进行查询1、简介2、利弊 三、CQRS架构1、设计2、存储3、数据访问模块 四、总结 一、使用API组合模式查询 1、简介 这是最简单的方法&#xff0c;应尽…

WebDAV之π-Disk派盘 + PDF Expert

PDF Expert 支持WebDAV方式连接π-Disk派盘。 PDF Expert是一款macOS上的办公软件,它具有专业的PDF编辑功能,可以快速从邮件、网页支持PDF打开,支持用户进行阅读、批注等功能,用户可以直接在PDF上进行编辑文字图片,表单文档、创建笔记、添加书单等自定义使用,大大提高工…

手写JAVA线程池

前言 手写一个简单的java线程池&#xff1a;重点关注&#xff0c;如何确保一直有运行的线程&#xff1f;如何确保线程消费提交的任务信息&#xff1f;。一直保存有运行的线程底层使用的是死循环。使用消息队列确保信息的提交和消费。消息队列使用先进先出原则。 步骤 线程池…

漏洞复现 || OpenSNS远程命令执行漏洞

免责声明 技术文章仅供参考&#xff0c;任何个人和组织使用网络应当遵守宪法法律&#xff0c;遵守公共秩序&#xff0c;尊重社会公德&#xff0c;不得危害网络安全&#xff0c;不得利用网络从事危害国家安全、荣誉和利益&#xff0c;未经授权请勿利用文章中的技术资料对任何计…

力扣 | 二分查找模板

力扣&#xff1a;二分查找 文章目录 &#x1f4da;二分查找&#x1f4da;模板I&#x1f449;x 的平方根&#x1f449;猜数字大小&#x1f449;搜索旋转排序数组 &#x1f4da;模板II&#x1f449;第一个错误的版本&#x1f449;寻找峰值 &#x1f4da;模板III&#x1f449;在排…

photoshop制作法线和凹凸贴图

做个选区 Ctrlj 法线贴图 生成凹凸贴图

Vue实现多语言(i18n)

第一步 安装i18n插件。 npm install vue-i18n第二步 在src目录下&#xff0c;创建一个【language】文件夹&#xff0c;并创建两个语言包js文件。 中文语言包&#xff1a;【zh.js】 英文语言包&#xff1a;【en.js】 第三步 完善en.js文件和zh.js文件。两个文件的结构要相…

系统架构设计师-项目管理

目录 一、盈亏平衡分析 二、进度管理 1、WBS工作分解结构 2、进度管理流程 &#xff08;1&#xff09;活动定义 &#xff08;2&#xff09;活动排序 &#xff08;3&#xff09;活动资源估算&#xff1a; &#xff08;4&#xff09;活动历时估算&#xff1a; &#xff08;5&…

谷歌浏览器添加首页快捷方式,并设置默认搜索引擎为百度

目录 1、添加首页快捷方式 ​2、谷歌浏览器设置默认搜索引擎 1、添加首页快捷方式 &#xff08;1&#xff09;首先要保证当前的默认搜索引擎为Google才可以添加首页的快捷方式。 &#xff08;2&#xff09;回到首页即可添加和自定义快捷方式的url &#xff08;3&#xff09;默…

Linux——系统文件IO(文件操作符 详解+代码)

文件操作符 1.回顾C语言文件接口总结 2.系统文件IO2.1 open函数介绍2.2代码测试2.3Q :fd为什么是3&#xff1f;012去哪里了&#xff1f;A: 3.如何理解Linux下一切皆文件 1.回顾C语言文件接口 写文件 #include <stdio.h> #include <string.h> int main() { FILE *…

【双指针】24. 两两交换链表中的节点

24. 两两交换链表中的节点 解题思路 dummyNode指向22 指向11 指向3然后移动指针 开始交换 3 4 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* L…

OpenAI GPT-4 Code Interpreter测试

OpenAI GPT-4 Beta版本Code Interpreter功能分析 OpenAI最近在GPT-4中推出了Code Interpreter功能的Beta版本&#xff0c;它是ChatGPT的一个版本&#xff0c;可以编写和执行Python代码&#xff0c;并处理文件上传。以下是对其表现的基本分析。 主要功能 文件信息获取&#xf…

Flutter入门教程(一),2023最新版包含安装,初始化!简单易懂!

Flutter入门教程&#xff08;一&#xff09;&#xff0c;2023最新版包含安装&#xff0c;初始化&#xff01;简单易懂&#xff01; Flutter介绍 首先&#xff0c;在一切的开始之前我们来介绍一下什么是Flutter&#xff0c;Flutter 是一个由 Google 开发的开源移动应用程序开发…

Openlayers实战:加载静态图片作为底图

我们经常会看到一些商场地图或者其他的静态图展示的情况,在Openlayers实战中,我们加载静态图片,使其成为底图,通过缩放,来展示各个部分。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhuanlan),还是大剑师兰特(CSDN) * @此源代码版权归大剑师兰特所有,可供学习或…

回首2023上半年:成长、思考、感恩

文章目录 每日一句正能量前言一、目标达成情况总结二、工作和学习成果总结三、下半年规划总结四、个人想法 后记附录 每日一句正能量 做一个向日葵族&#xff0c;面对阳光&#xff0c;不自艾自怜&#xff0c;每天活出最灿烂的自己。曾经拥有的&#xff0c;不要忘记。不能得到的…

【JAVA】定时任务之借阅到期自动催还

该篇主要以定时任务为主&#xff0c;通知略为记录 一. 定时任务逻辑代码 定时任务文件 TaskScheduling.java package org.springblade.modules.task;import lombok.extern.slf4j.Slf4j; import org.springblade.modules.archiveAdvantage.service.IArchiveBorrowService; im…

Pytorch基本使用—激活函数

✨1 介绍 ⛄ 1.1 概念 激活函数是神经网络中的一种数学函数&#xff0c;它被应用于神经元的输出&#xff0c;以决定神经元是否应该被激活并传递信号给下一层。常见的激活函数包括Sigmoid函数、ReLU函数、Tanh函数等。 &#x1f384; 1.2 性质 激活函数是神经网络中的一种重…

Markdown基本用法

目录 1 字体倾斜 1.1 加* 1.2 加_ 2 字体加粗 2.1 加** 2.2 加__ 3 字体上带删除线 4 文字变标题 5 超链接 5.1 直接输入地址 5.2 将超链接改成文字 5.2.1 同行写法 5.2.2 不同行写法 6 文字前加 6.1 号 6.2 *号 6.3 -号 7 有序列表 8 …