冒泡--选择--插入--希尔排序

十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序 冒泡排序、选择排序、插入排序、快速排序、希尔排序 阅读详情
#include <cstdlib>
#include <iostream>
#include <ctime>

using namespace std;

template <typename T>
void print(const T *A, int n)
{
	for(int i=0; i<n; i++)
		cout << A[i] << " ";
	cout << endl;
}

template<typename T>
void swapN(T &a, T &b)
{
	T tmp = a;
	a = b;
	b = tmp;
}

// 冒泡排序: 每次循环总是将最大元素移到队尾: O(n^2),稳定的排序算法
template<typename T>
void bubbleSort(T *A, int n)
{
	for(int i=0; i<n-1; i++)
	{
		for(int j=0; j<n-i-1; j++)
		{
			if(A[j] > A[j+1])
			{
				swapN(A[j],A[j+1]);
			}
		}
	}
}

// 鸡尾酒排序:冒泡排序的改进,第一轮,从小到大,第二轮,从大到小,循环: O(n^2)
template<typename T>
void cocktailSort(T *A, int n)
{
	int left=0;
	int right = n-1;
	while(left<right)
	{
		for(int i=left; i<right; i++)
		{
			if(A[i] > A[i+1])
				swapN(A[i],A[i+1]);
		}
		right--;
		for(int i=right; i>left; i--)
		{
			if(A[i] < A[i-1])
				swapN(A[i],A[i-1]);
		}
		left++;
	}
}

// 选择排序:每次从剩余的元素中找出最大的元素与队尾元素交换: O(n^2), 不稳定的排序算法
template <typename T>
void selectSort(T *A, int n)
{
	for(int i=0; i<n-1; i++)
	{
		int min=i;
		for(int j=i+1; j<n; j++)
		{
			if(A[j]<A[min])
				min = j;
		}

		if( min!= i)
			swapN(A[min],A[i]);
	}
}

// 插入排序: 左手持牌,右手的牌倒序遍历插入, O(n^2), 最好情况能到O(n)

template<typename T>
void insertSort(T *A, int n)
{
	for(int i=1; i<n; i++)
	{
		T cur = A[i];
		int j;
		for(j=i-1; j>=0; j--)
		{
			if(A[j] > cur)
			{
				A[j+1] = A[j];   // 后移操作。。。
			}else
			{
				break;
			}
		}
		A[j+1] = cur;   // 找到要插入的位置进行插入
	}
}

// 希尔排序:插入排序的一种高效改进,按间隔h一次执行插入排序,使得原始数组变得越来越有序,
// h逐渐递减到1,变成正常的插入排序,插入排序对于大部分有序的数列更有效: 不稳定的排序: O(nlogn)~O(n^2)
template<typename T>
void shellSort(T *A, int n)
{
	int h=0;
	while( h<=n )
	{
		h = 3*h + 1;   // 生成间隔h
	}
	while( h>=1 )
	{
		// 完成间隔为 h 子序列的插入排序
		for(int i=h; i<n; i+=h)
		{
			T cur = A[i];
			int j;
			for(j = i-h; j>=0; j-=h)
			{
				if(A[j]>cur)
					A[j+h] = A[j];
				else
					break;
			}
			A[j+h] = cur;
		}
		h = (h-1)/3;   // 递减间隔
	}
}

int main()
{
	int n;
	while(cin>>n)
	{
		int *A = new int[n];
		srand(time(NULL));
		for(int i=0; i<n; i++)
			A[i] = rand()%100;

		print(A,n);
		
		//bubbleSort(A,n);
		//cocktailSort(A,n);
		//selectSort(A,n);
		//insertSort(A,n);
		shellSort(A,n);
		print(A,n);

		delete[] A;
	}
	return 0;
}

C++实现排序 - 01 冒泡、选择、插入和希尔排序 冒泡排序正如其名,这个算法像是泡泡一样往上升,具体步骤如下:为了方便理解,我们还是来看图:第一步:比较第一个元素与第二个元素,不存在逆序,后移一位。第二步:比较第二个元素和第三个元素,不存在逆序,后移一位。第三步:比较第三个元素和第四个元素,不存在逆序,后移一位。第四步:比较第四个元素和第五个元素,存在逆序,交换两者,后移一位。第五步:比较第五个元素和第六个元素,存在逆序,交换两者,后移一位。第六步:比较第六个元素和第七个元素,存在逆序,交换两者,后移一位。第七步:比较第七个元素和第八个元素,存在逆序,交换 阅读详情

相关推荐

【常见的六大排序算法】插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序

在实现排序前,我们要先知道什么是排序。排序:简单的来说就是把一串数据按照一定的方式依次排序。例如:可以按照数字的大小升序或降序排列,或者按照英文字母的先后顺序排列等。使用这一系列的方式,就可以将一串无序状态下的数据排列成有序的数据。

2301_81044829的博客 3533

常用排序算法总结

2018/05/11 · IT技术 · 排序算法, 算法分享到:原文出处: SteveWang   我们通常所说的排序算法往往指的是内部排序算法,即数据记录在内存中进行排序。排序算法大体可分为两种:一种是比较排序,时间复杂度O(nlogn) ~ O(n^2),主要有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序等。另一种是非比较排序,时间复杂度可以达到O(n),主要有:计数排序,基数排...

l864627349的博客 1292

高德地图+Three.js实战:手把手教你打造数字农场3D可视化大屏(附完整源码)

本文详细介绍了如何利用高德地图JS API与Three.js技术栈,构建一个功能强大的数字农场3D可视化大屏。文章从技术选型、架构设计出发,深入讲解了坐标对齐、图层管理、性能优化等核心工程实践,并提供了完整的模块化代码示例,旨在为智慧农业及类似场景的3D地理可视化项目提供一套可复用的解决方案。

k8s6orchestrator的博客 890

八大排序(一):四种简单的排序(直接插入排序、希尔排序、冒泡排序、选择排序)

一、直接插入排序 直接插入排序基本思想是每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。 直接插入排序算法的运作如下: 假设有一组无序序列 R0, R1, … , RN-1。 (1) 我们先将这个序列中下标为 0 的元素视为元素个数为 1 的有序序列。 (2) 然后,依次把 R1, R2, … , RN-1 插入到这个有序序列中。所以,我们需要一个外部...

FREEMAN 1万+

Playwright自动化测试实战:攻克日历时间控件三大策略与Java实现

在Web自动化测试领域,元素定位与交互模拟是核心技术基础,其原理在于通过程序精确识别并操作页面中的DOM元素,以模拟真实用户行为。这项技术的核心价值在于提升测试效率、确保交互逻辑的覆盖度与可靠性,广泛应用于电商、金融、OA等系统的功能验证。日历时间控件作为典型的复杂交互组件,常涉及动态弹出层、多级导航与状态同步,是自动化测试中的常见难点。本文聚焦于使用Playwright工具,针对此类控件深入剖析了三种核心解决策略:从最高效的直接赋值、到全面模拟用户交互的主流方法,再到利用组件特性的混合定位方案,并结合Ja

weixin_28835551的博客 311

MACS2软件进行Peak calling

MACS2可以检出ChIP-Seq,ATAC-seq 以及 MeRIP-seq (RNA甲基化测序) 等富集的序列。peaks calling 有不同的方法,MACS2是最常用的call peaks工具。 MACS全称Model-based Analysis of ChIP-Seq,最初的设计是用来鉴定转录因子的结合位点,但是它也可以用于其他类型的富集方式测序。usage: macs2 [-h] [--version] {callpeak,bdgpeakcall,bdgbroadca

qq_27390023的博客 3791

数据结构——选择排序,冒泡排序,直接插入排序,希尔排序总结

选择排序:在第一次排序过程中将第一个数字和最小的数字位置互换;第二次排序过程中,将第二个数字和剩下的数字中最小的数字位置互换;依此类推,每次都将下一个数字和剩余的数字中最小的数字进行位置互换,直到将一组数字按从小到大排序。时间复杂度:O(n^2),空间复杂度:O(1),算法稳定性:不稳定代码:void SelectSort(int *arr,int len) { int i; int j; ...

DevilNeverMayCry的博客 3411

渗透测试自学日志之漏洞复现篇:漏洞列表

复现成功的漏洞列表,有复现方式,各位可以参考。 网络安全,人人有责,使用本文进行非法活动,与本人无关

maverickpig的博客 2175

冒泡,选择,插入,希尔排序

假设排升序,第一个数自然是有序的,第二个数与第一个数比较,如果比第一个数小就与其交换,然后看第三个数,此时前两个数是有序的,第三个数先于第二个数比较,比第二个数小就与其交换,再与第一个数比较,比第一个数小就与其交换,如果不比第二个数小就看第四个数,此时前三个数都是有序的以此类推。直接插入排序是和距离为1的元素比较,而希尔排序是和距离为gap的元素比较,gap不断变小,直到变为1,此时即是直接插入排序。当数据全都有序时,最快。从时间上讲,gap越大,大的数可以越快的到后面去,小的数可以越快的到前面去。

m0_68142120的博客 1451

告别代码丢失!用Git+Gitee管理你的Keil5单片机项目(保姆级图文教程)

本文详细介绍了如何利用Git和Gitee高效管理Keil5单片机项目,解决嵌入式开发中的代码丢失问题。通过精准配置.gitignore文件、设计适合团队的协作流程以及搭建安全备份体系,开发者可以轻松实现版本控制,提升工作效率。特别针对Keil工程的特殊文件类型,提供了实用的过滤规则和操作技巧。

weixin_33686714的博客 470

RK3568_Android15适配以太网网卡gmac+国产phy芯片YT8531

本文介绍了在Android15 SDK上适配正点原子ATK-DLRK3568开发板网卡的过程。开发板采用GMAC接口搭配YT8531C PHY芯片,包含两个千兆网口。主要内容包括:硬件原理图确认、网络链路连接方式、内核DTS配置(包括GMAC0和GMAC1的参数设置)、PHY驱动适配(基于motorcomm.c驱动文件)、PHY寄存器读写调试方法以及MAC地址设置方式。文章还分析了常见问题,如网卡注册后无法ping通网络的故障现象。通过详细的硬件确认和软件配置,实现了双网卡在Android系统上的完整适配。

Android/Linux驱动开发传帮带学习,让驱动入门门槛更低! 2016

八大排序(一)冒泡排序,选择排序,插入排序,希尔排序

从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。如果待排序序列的初始状态恰好是我们希望的排序结果(如升序或降序),一趟扫描即可完成排序。所需的关键字比较次数C和记录移动次数M均达到最小值:冒泡排序最好的时间复杂度为O(n)。

m0_69323023的博客 1520

C#实现鼠标点击任意绝对位置(附完整源码)

C#实现鼠标点击任意绝对位置(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 480

冒泡快排选择插入希尔排序

1.选择排序 每次把未排序的数组中的最小值放到当前位置。循环一定次数就达到了排序效果 public static void main(String[] args) { int[] nums = {9, 5, 2, 7, 1}; for (int i = 0; i < nums.length - 1; i++) { for ...

???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 1万+

PyTorch深度学习实战(1)——神经网络与模型训练过程详解

在本节中,我们将了解传统机器学习与人工神经网络间的差异,并了解如何在实现前向传播之前连接网络的各个层,以计算与网络当前权重对应的损失值;实现反向传播以优化权重达到最小化损失值的目标。并将实现网络的所有关键组成——前向传播、激活函数、损失函数、链式法则和梯度下降,从零开始构建并训练了一个简单的神经网络。

盼小辉丶的博客 9万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

插入,冒泡,选择,希尔排序

希尔排序 int[] array={}; int count = array.length; for(int dk=count/2;dk&gt;0;dk=dk/2){ //dk增量 for(int i=0;i&lt;dk;i++){ //直接插入排序 for(int j=i+dk;j&lt;count;j+=dk){ if(array[j]&lt;array[j-dk]){ //如果相邻的两元素,...

weixin_43708218的博客 296

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

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

未见花闻的博客 1524

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

冒泡排序,选择排序,插入排序,希尔排序

冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端 算法描述 比较相邻的元素。如果第一个比第二个大,就交换它们两个; 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数; 针对所有的元素重复以上的步骤,除了最后一个; 重复以上步骤,

Yesterday Once More的博客 613

排序算法:冒泡排序、插入排序、选择排序、希尔排序

目录 一、冒泡排序: 二、插入排序: 三、选择排序: 四、希尔排序: 一、冒泡排序: 1、算法原理: 冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系的要求。如果不满足就让它俩互换位置。一次冒泡会让至少一个元素移动到它应该在的位置,重复n次,就完成了n个数据的排序工作。 2、算法描述: (1)比较相邻的元素。如果第一个比第二个大,就交换它们两个; (2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数

qq_55624813的博客 4512

数据结构——冒泡、选择、插入和希尔排序

数据结构——排序 第一篇 求点赞收藏关注!!!

2301_80401288的博客 1137

排序算法一之冒泡 选择 插入 希尔排序

冒泡排序:就是交换相邻的两个数,每次m

山之巅的专栏 908

【数据结构】冒泡、选择、插入、希尔排序的实现

本文介绍了四种基础排序算法:冒泡排序通过相邻元素比较交换将最大元素移到末尾;选择排序每次遍历选择最小/最大元素交换到起始/末尾位置;插入排序构建有序序列并逐个插入未排序元素;希尔排序是插入排序的优化,通过gap分组预排序提升效率。每种算法均包含思想描述、具体步骤和C语言实现代码,其中冒泡排序和选择排序还提供了优化版本。这些算法虽然时间复杂度较高(多为O(n²)),但作为基础排序方法,对理解更复杂算法具有重要意义。

2301_79989168的博客 1436

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

而选择排序中的“选择”是指不断从无序序列中选择最小的值放入到有序序列的最后的位置,换句话说就是从现有的无序序列中找出那个最小的值,然后与无序序列的第一个值进行交换,然后缩小无序序列的范围即可。因为有序序列的最后一个值与无序序列的第一个值紧挨着,交换后,这个无序序列中的第一个值就成了有序序列的最后一个值。每一轮插入都会取出无序数列中的第一个元素插入到有序数列中,这个插入的过程其实就是一个比较交换的过程,如果要插入的值比前面的值要小,就要交换,直到不能交换为止。在博客的开头的,我们先给出排序协议的定义。

2301_78008478的博客 1153

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

一、冒泡排序 1、算法步骤 比较相邻的元素,如果第一个比第二个大,就交换他们的位置 对每一对相邻元素做同样的操作,从开始第一对到结尾的最后一对处理完,最后的元素为最大的元素 重复以上的步骤,最后比较元素为从最后一个元素依次递减。直到没有元素比较 2、java代码 public class MaoPaoSort { public static void main(String[] args) { int[] arr = {5,2,4,10,0,3,1}; maop

lss0555的博客 536

探索数据结构:冒泡,选择,插入,希尔排序的实现与应用

这篇博客将介绍数据结构中常用的排序算法。排序算法在计算机科学中扮演着重要角色,能够将数据按照特定的顺序进行排列。我们将深入探讨各种排序算法的原理、复杂度分析和应用场景,包括冒泡排序、选择排序、插入排序、归并排序等。通过阅读博客,您将深入了解这些算法的实现方式和它们之间的差异,从而更好地理解和应用排序算法。

Bettysweetyaaa的博客 1180

python 冒泡、选择、插入、希尔排序算法

冒泡、选择、插入、希尔排序算法 冒泡排序: 冒泡排序的时间复杂度是O[n*n],是一种最简单的,最暴力的排序方法。它的工作原理是每次循环两两比较,将将大的值一次往后边放,最后完成升序排序。代码如下: def bubble_sort(nums): for i in range(len(nums) - 1): # 这个循环负责设置冒泡排序进行的次数(比如说n个数,则只要进行n-1次冒泡,就可...

iam_zhanghongliang的博客 214
上一篇: 快速排序与堆排序
下一篇: 理解向量vector的一些实现细节
FireMicrocosm
博客等级 码龄12年 261粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值