选择排序和插入排序及其优化

十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序 冒泡排序、选择排序、插入排序、快速排序、希尔排序 阅读详情

选择排序(固定位置,找元素)

基本思想:对于长度为N的无序数列,第一次遍历,将第0个元素和后边所有元素相比较,找出最小的元素,然后和第0个元素交换,第二遍历,将第1个元素和后边所有的元素比较,找出剩下元素中最小的元素,然后和第1个元素交换,重复以上步骤直至最后一次遍历只剩下两个元素的时候,排序完成。

时间复杂度:O(n*n)

空间复杂度:O(1)

是否是稳定排序:不是稳定排序

代码示例:(根据上面的算法思想不难写出下面的代码)

 

#include <stdio.h>
#include <stdlib.h>

#defind ARRAY_LEN(x) (sizeof(x)/sizeof((x)[0]))

int exchange_times = 0;
int compare_times = 0;

int Swap(int *a, int *b)
{
	int c;
	int ret = -1;
	
	ret = (a != NULL)&&(b != NULL);
	
	if(ret)
	{
		c = *a;
		*a = *b;
		*b = c;
	}
	
	return ret;
}

int SelectSort1(int a[], int n)
{
	int ret = -1;
	int i = 0, j = 0;
		
	ret = (a != NULL)&&(n > 0);
	
	if(ret)
	{
		//外层循环最多进行n-1次 
		for(i = 0; i < n - 1; i++)
		{			
			for(j = i + 1; j < n; j++)
			{
				if(a[j] < a[i])
				{
					Swap(&a[i],&a[j]);
					exchange_times++;					
				}
				compare_times++;
			}	
		}
	}
	
	return ret; 
}


int PlayFunc(int *a, int n)
{
	int i = 0;
	int ret = -1;
	
	ret = (a != NULL)&&(n > 0);
	
	if(ret)
	{
		printf("Array[]:");
		for(i = 0; i < n; i++)
			printf("%d, ", a[i]);
		printf("\n");
	}
	
	return ret;
}

void main()
{
	int array[] = {8,5,10,7,6,9,4,3,2,1};

    PlayFunc(array, ARRAY_LEN(array));
	
	SelectSort1(array, ARRAY_LEN(array));
	
	PlayFunc(array, ARRAY_LEN(array));
	
	printf("exchange_times: %d\n", exchange_times);
	printf("compare_times: %d\n", compare_times);
}

 

 

运行效果截图:


 

 

 

上面的选择排序一样可以优化,每次只做比较,记录下无序序列中最小元素的下标,即每次遍历最多交换一次。下面贴上代码:

 

int SelectSort2(int a[], int n)
{
	int ret = -1;
	int i = 0, j = 0;
	
	int MinIndex = 0;
	
	ret = (a != NULL)&&(n > 0);
	
	if(ret)
	{
		//外层循环最多进行n-1次 
		for(i = 0; i < n - 1; i++)
		{
			MinIndex = i;		
			for(j = i + 1; j < n; j++)
			{
				if(a[j] < a[MinIndex])
				{
					MinIndex = j;//找出并记录最小值下标 
				}
				compare_times++;
			}
			
			if(i != MinIndex)
			{
				Swap(&a[i],&a[MinIndex]);
				exchange_times++;
			}
		}
	}
	
	return ret; 
}


运行效果截图:(和上面优化前相比,元素交换次数大大减少)

 

算法是不是很神奇!!!

 

 

 

插入排序(固定元素,找位置)

基本思想:对于长度为N的无序数列,需要进行N-1次插入排序。第一次,数列中第0个数认为是有序的数列,将数列中第1个元素插入仅有1个有序的数列中,第二次,数列的前两个元素已经成了有序数列,继续将第2个元素插入到前面两个元素的有序序列中,直到第N-1次,将数组中第N-1(最后一个)个元素插入前面的有序序列中,插入排序完成。

时间复杂度:O(n*n)

空间复杂度:O(1)

是否是稳定排序:稳定排序

代码示例:

 

#include <stdio.h>
#include <stdlib.h>

#define SIZE 10

int exchange_times = 0;
int compare_times = 0;

int Swap(int *a, int *b)
{
	int c;
	int ret = -1;
	
	ret = (a != NULL)&&(b != NULL);
	
	if(ret)
	{
		c = *a;
		*a = *b;
		*b = c;
	}
	
	return ret;
}

int InsertSort1(int a[], int n)
{
	int ret = -1;
	int i = 0, j = 0;
	int Temp = 0;
		
	ret = (a != NULL)&&(n > 0);
	
	if(ret)
	{
		for(i = 1; i < n; i++)
		{
			if(a[i-1] > a[i])//从小到大排列  0到i-1是已经排好的有序序列 
			{
				Temp = a[i];
				
				for(j = i - 1; (j >= 0) && (Temp < a[j]) ; j--)//边比较边挪数据 
				{
					a[j+1] = a[j];
					exchange_times++;
					//compare_times++; 
				}
				
				a[j+1] = Temp;//将数据插入恰当的位置 
				compare_times++; 
			}
		}
	}
	
	return ret; 
}



int PlayFunc(int *a, int n)
{
	int i = 0;
	int ret = -1;
	
	ret = (a != NULL)&&(n > 0);
	
	if(ret)
	{
		printf("Array[]:");
		for(i = 0; i < n; i++)
			printf("%d, ", a[i]);
		printf("\n");
	}
	
	return ret;
}

void main()
{
	int array[SIZE] = {8,5,10,7,6,9,4,3,2,1};

	PlayFunc(array, 10);
	
	InsertSort1(array, 10);
		
	PlayFunc(array, 10);
	
	printf("exchange_times: %d\n", exchange_times);
	printf("compare_times: %d\n", compare_times);
}


运行效果截图:

 

此处的交换次数和比较次数不能说明什么,这个算是简单的插入排序吧。同样算法还可以继续优化...未完待续!!!

 

排序算法——冒泡排序、选择排序、插入排序、希尔排序、归并排序 一、冒泡排序、冒泡排序的优化算法 1.冒泡排序的概念 冒泡排序是一种简单的排序算法,它重复的访问要排序的数列,一次进行两个元素的比较操作,如果不符合则元素之间进行交换。重复进行元素之间的比较操作,直到元素不再需要交换,继而该排序过程已经完成。 2. 冒泡排序的算法描述 a. 比较相邻的元素如果第一个比第二个大,就交换这两个元素; b. 每一趟最后的元素就是最大的元素; c. 重复以上步骤,直到排序... 阅读详情

相关推荐

一文读懂GAN, pix2pix, CycleGAN和pix2pixHD

本文翻译、总结自朱俊伟的线上报告,主要讲了如何用机器学习生成图片。 来源:Games2018 Webinar 64期 :Siggraph 2018优秀博士论文报告 人员信息 主讲嘉宾 姓名:朱俊彦(Jun-Yan Zhu) 现状:麻省理工学院博士后(PostDoc at MIT),计算机科学与人工智能实验室(Computer Science and Artificial In...

gdymind的博客 6万+

排序算法(插入排序,希尔排序,选择排序,堆排序,冒泡排序)

直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为 止,得到一个新的有序序列。(1)插入排序是对一个已经有序的区间进行插入操作,建立一个临时变量tmp来保存需要插入的数据。(2)将tmp与前一个数据进行比较,如果该数据大于tmp,则该数据往后移动。(3)直到遇到小于tmp的数据,然后将tmp赋值给该数据的下一个就完成了一次的插入(4)按我的理解,插入排序是将一组数据从无到逐个插入到该数组中去,直到插入最后一。

2301_80143907的博客 1699

超声波 vs 红外 vs 激光雷达:扫地机器人避障传感器选型指南(实测对比)

本文深入对比了扫地机器人三种主流避障传感器——超声波、红外与激光雷达的核心原理与实测表现。文章基于成本、精度、环境适应性等关键指标,提供了清晰的选型决策树和典型场景配置方案,旨在帮助开发者与爱好者根据项目需求与预算,构建高效可靠的机器人避障系统。

h0i1j2k3l的博客 690

【排序算法】插入排序与选择排序详解

选择排序是一种简单直观的排序算法。它的工作原理如下:在未排序序列中找到最小(大)元素,交换到起始位置,该元素为已排序序列的起始元素,继续在剩余未排序元素中找到最小(大)元素,交换到未排序序列起始位置,重复第二步,直到所有元素均排序完毕。在元素集合array[i]–array[n-1]中选择关键码最大(小)的数据元素,若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换,在剩余的array[i]–array[n-2](array[i+1]–array[n-1])集合中,重

a_sen的博客 4068

某手 v8.x 签名计算方法(二) sig和__NS_sig3

一、目标 今天的目标是 sig和__NS_sig3,咱们抓个包先 二、步骤 sig目测像是MD5 先jadx搜索 sig= ,没有找到结果。 再试试 sig ,晕倒 6k多个结果,突然灵光一闪,这些参数,必然是要加入到 Map中,那么我们搜索 "sig" 应该就是这个 CPU.getClock,Hook之 var signCls = Java.use('com.yxcorp.xxx.util.CPU'); signCls.getClock.implementation = function(a,b,c

fenfei331的博客 2428

手把手教你用UC3844设计多路输出反激电源(附PCB布局避坑指南)

本文详细介绍了使用UC3844设计多路输出反激电源的实战技巧,包括核心电路设计、变压器参数计算、PCB布局优化及EMI抑制方法。通过实验室实测数据和项目经验,帮助工程师避开常见设计陷阱,提升电源性能和可靠性。特别附赠PCB布局避坑指南,助力高效完成开关电源设计。

weixin_30300225的博客 568

【插入排序、选择排序回顾】插入排序、选择排序、希尔排序的理解

文章目录插入排序(Insertion Sort)插入排序具体实现:代码:复杂度:选择排序(Selection Sort):希尔排序 # 插入排序、选择排序、希尔排序 插入排序(Insertion Sort) 一个有序的数组,我们往里面添加一个新的数据后,如何继续保持数据有序呢?很简单,我们只要遍历数组,找到数据应该插入的位置将其插入即可。 这是一个动态排序的过程,即动态地往有序集合中添加数据,我们可以通过这种方法保持集合中的数据一直有序。而对于一组静态数据,我们也可以借鉴上面讲的插入方法,来进行排序,.

NothingYCX的博客 364

uniapp [全端兼容] - 实现全景图Vr 720°全景效果查看预览功能,3D全景图流畅不卡顿渲染+手势拖拽+悬浮工具按钮,uniAPP实现vr看720度全景效果示例代码(H5小程序APP全兼容)

uniapp显示720度全景图,720°全景图显示,在h5中展示720°全景图,浏览全景图,基于uniApp实现vr全景预览,加载全景图,uni-app全景预览插件,UNI-APP实现3D全景图,实现720°全景图展示,uniapp全景视频播放,uniapp项目实现vr720度全景图片预览,在网页上展示760全景图片和视频,全景图场景切换,UNIAPP全景VR图,uniapp加载720全景图_uniapp怎么加载vr图片,uniapp实现vr全景看房,uni-app实现全景效果,加载很慢卡怎么办,实现全景预

🏆 前端领域优质创作者 1万+

【排序篇】插入排序与选择排序

本文将详细的介绍排序中的希尔排序和堆排序

Yui_的博客 1444

手把手教你学Simulink——基于Simulink的多用户MIMO系统仿真建模示例

多用户MIMO概述在多用户MIMO系统中,基站配备多个天线,可以同时与多个用户进行通信。利用空间复用技术,不同用户的信号被分配到不同的空间流上,从而实现频谱资源的高效利用。多用户MIMO的核心挑战包括信道估计、波束成形设计以及干扰管理。关键技术点波束成形:通过调整发射信号的相位和幅度,在特定方向上增强信号强度并减少干扰。信道估计:获取每个用户的信道状态信息(CSI),用于优化波束成形矩阵。调制与解调:选择合适的调制方式(如QPSK、16-QAM等)以适应不同用户的信道条件。干扰消除。

MHD0815的博客 268

天爱验证码wasm验证码逆向

本文分析了某网站采用WASM加密技术的情况,发现其加密方式主要针对data和轨迹信息,整体加密逻辑变化不大。通过反混淆技术可以还原代码,并确认加密过程分为两步:先对原始参数逐个加密,再调用WASM模块进行最终加密。研究发现关键参数drives和ki都存储在WASM模块内,通过提取wasm_exec.js文件即可直接使用该加密功能。本文仅提供技术研究思路,强调严禁用于任何违法行为。

码王吴彦祖的博客 933

算法——插入排序与选择排序

一、插入排序 <1>、直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一 个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 思想十分简单,算法实现如下: //直接插入排序 越有序插入越快 //将每一个数与前面所有排好序的数字相比较,如果大了 直接放入即可 public static void in...

qq_43847542的博客 214

【人工智能】全面盘点国内AI九大模型:各擅胜场的智能先锋(豆包、文心一言、讯飞星火、通义千问、Kimi、智谱清言、腾讯元宝、秘塔、天工AI)

追求性价比与全能:选豆包,适合个人与中小企业日常使用;侧重中文创作与理解:选文心一言,文学与商业文案创作首选;需要专业语音交互:选讯飞星火,智能客服、车载场景必备;看重生态与多场景:选通义千问,适配电商、办公等企业需求;处理超长文本任务:选Kimi,文档分析、学术研究的利器;专注深度推理创作:选智谱清言,学术与创意写作的伙伴;依赖腾讯生态协同:选腾讯元宝,日常轻量需求的便捷之选;深耕法律学术领域:选秘塔,专业文本处理的权威工具;布局前沿技术体验:选天工AI,享受接近国际顶尖的智能服务。

奶爸的编程之路,也就一周冷个三天 1121

选择排序,冒泡排序,插入排序,快速排序及其优化

图解四大排序:选择排序,冒泡排序,插入排序,快速排序

我的博客 2367

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

选择排序与插入排序及其优化

排序1

m0_73488514的博客 336

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

排序大总结(冒泡,选择,希尔,快排(及其优化),堆排序,插入排序,归并排序)

#排序模板 public abstract class Sort<T extends Comparable<T>> { public abstract void sort(T[] nums); protected boolean less(T v,T w){ return v.compareTo(w)<0; } pr...

qq_39352109的博客 1300

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

java基础篇之6----优化后的冒泡排序、插入排序、选择排序;多维数组及其拷贝

(一)排序: 这里所说的三种排序都是内部排序: 冒泡排序,插入排序,选择排序 1: 冒泡排序: 冒泡排序使之将相邻的两个数值相互比较,第一个数值比第二个大就交换位置,将最大的数值沉到最底下, 每一次这样循环一次之后都会有一个最大的数在后面,每确定一个最大的数,那个数在最后面不动它,这是内循环 然后将外循环的次数减少一次。 // 优化后的冒泡排序 // 最好情况时间复杂度:o(n) ...

qq_41884976的博客 218

【JavaSE与数据结构】排序算法之冒泡排序,选择排序,插入排序与希尔排序

本篇文章带大家认识排序算法——冒泡排序,选择排序,插入排序与希尔排序,其中冒泡排序,选择排序,插入排序是基础的排序算法,希尔排序是插入排序的优化,四种排序算法全部都是基于比较的排序算法,本文将以图解动图的方式描述算法实现过程,实现代码为java。

未见花闻的博客 1523

排序——插入排序、希尔排序、选择排序

插入排序、希尔排序、选择排序

finish_speech的博客 516

排序算法一------插入排序,使用二分查找法对插入排序进行优化,希尔排序

外部排序:指数据不能一次性加载到内存里去内部排序:指数据能一次性加载到内存里去非比较排序:不用比较就能进行的排序比较排序:进行比较才能进行的排序稳定性:如两个学生按照学号排:a在b的前面,按照成绩排a还是在b的前面,则这种排序算法是稳定的;若是如两个学生按照学号排:a在b的前面,按照成绩排b在a的前面,则是不稳定的(成绩是有序的)排序算法分类:    1、插入排序:插入排序.h# pragma o...

xuruhua的博客 1062

冒泡,选择,插入排序优化,堆排序和qsort的用法

受到宫学长讲座的启发,学到不少的排序方法,所以也想记下来总结一下。所有排序默认都是从大到小排序冒泡排序的优化#include<stdio.h> void swap(int *a,int *b) void bubble1_sort(int *a,int len); void bubble2_sort(int *arr,int n); void bubble3_sort(int *arr,int len

坏鱼儿恋夏的博客 385

插入排序和归并排序算法的实现和优化

插入排序算法是专门对于数组进行排序的一种算法。可以将无序的数组转化成为有序的状态。可以说插入排序算法是我们排序算法当中最简单的算法之一。其主要进行的操作和我们打扑克当中抓拍的思路很相同。我们只需要保证我们最开始的数组为有序状态,拿到一个新的数据的时候就可以将该数据从最右边开始向左进行判断我们新数据想要插入的位置。如果小于我们最右边的数据就进行交换操作。直到第一次数据大于左侧的数据即可。实际过程如下图所示:但是我们可能有的同学会想:要是前面的元素不有序呢?这样不是使用起来很局限吗?

lmbuhuiku的博客 775

《算法_第四版》(三)选择排序、插入排序、希尔排序

关于排序算法,强烈推荐一个有意思的视频:你“听”过这些经典排序算法吗? 1、选择排序 算法很简单,简单到不知道怎么描述,直接看代码吧 package cn.nupt.sort; /** * @Description: 选择排序 * * @author PizAn * @date 2019年1月19日 下午3:28:59 * */ public class SelectionSo...

PizAn的博客 311

插入排序,选择排序,交换排序基本及优化

#include"Sort.h" #include&lt;stdio.h&gt; //插入排序 void print(int *array, int size) { int i = 0; for (i = 0; i &lt; size-1; i++) { printf("%d", arra...

Fcwyl000的博客 1063

排序算法1(冒泡排序、选择排序、插入排序、希尔排序)

排序算法1 目录排序算法1冒泡排序主要思想代码优化代码选择排序主要思想代码插入排序主要思想代码希尔排序主要思想代码使用希尔排序对冒泡进行优化代码 冒泡排序 主要思想 对排序序列从前向后,依次比较相邻元素的值,如果逆序则交换。 代码 static void BubbleSort(int[] arr) { for (int i = 0; i < arr.Length - 1; i++) { for (int j = 0; j < arr.Length - i - 1;

RoySummy的博客 288

冒泡排序 & 选择排序 &

一、冒泡排序(稳定的排序) 冒泡:以选出最大为例,如果a[i]>a[i+1],那么交换思路: 每一轮冒泡将会在剩下的(n-i)个元素中产生一个最大或者最少的值, 第一轮i等于0,第二轮i等于1… 而总共需要多少轮冒泡?需要n-1次。每一轮的冒泡需要比较(n-i-1)次即可确定一个极值,所以(n-i-1)就是一轮冒泡要比较的次数 所以时间复杂度为 O(n^2) void B...

ludan_xia的博客 383
上一篇: 高富帅
下一篇: Linux多线程编程API基础---1
coding__madman
博客等级 码龄11年 188粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值