#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;
}相关推荐
【常见的六大排序算法】插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序
在实现排序前,我们要先知道什么是排序。排序:简单的来说就是把一串数据按照一定的方式依次排序。例如:可以按照数字的大小升序或降序排列,或者按照英文字母的先后顺序排列等。使用这一系列的方式,就可以将一串无序状态下的数据排列成有序的数据。
常用排序算法总结
2018/05/11 · IT技术 · 排序算法, 算法分享到:原文出处: SteveWang 我们通常所说的排序算法往往指的是内部排序算法,即数据记录在内存中进行排序。排序算法大体可分为两种:一种是比较排序,时间复杂度O(nlogn) ~ O(n^2),主要有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序等。另一种是非比较排序,时间复杂度可以达到O(n),主要有:计数排序,基数排...
高德地图+Three.js实战:手把手教你打造数字农场3D可视化大屏(附完整源码)
本文详细介绍了如何利用高德地图JS API与Three.js技术栈,构建一个功能强大的数字农场3D可视化大屏。文章从技术选型、架构设计出发,深入讲解了坐标对齐、图层管理、性能优化等核心工程实践,并提供了完整的模块化代码示例,旨在为智慧农业及类似场景的3D地理可视化项目提供一套可复用的解决方案。
八大排序(一):四种简单的排序(直接插入排序、希尔排序、冒泡排序、选择排序)
一、直接插入排序 直接插入排序基本思想是每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。 直接插入排序算法的运作如下: 假设有一组无序序列 R0, R1, … , RN-1。 (1) 我们先将这个序列中下标为 0 的元素视为元素个数为 1 的有序序列。 (2) 然后,依次把 R1, R2, … , RN-1 插入到这个有序序列中。所以,我们需要一个外部...
Playwright自动化测试实战:攻克日历时间控件三大策略与Java实现
在Web自动化测试领域,元素定位与交互模拟是核心技术基础,其原理在于通过程序精确识别并操作页面中的DOM元素,以模拟真实用户行为。这项技术的核心价值在于提升测试效率、确保交互逻辑的覆盖度与可靠性,广泛应用于电商、金融、OA等系统的功能验证。日历时间控件作为典型的复杂交互组件,常涉及动态弹出层、多级导航与状态同步,是自动化测试中的常见难点。本文聚焦于使用Playwright工具,针对此类控件深入剖析了三种核心解决策略:从最高效的直接赋值、到全面模拟用户交互的主流方法,再到利用组件特性的混合定位方案,并结合Ja
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
数据结构——选择排序,冒泡排序,直接插入排序,希尔排序总结
选择排序:在第一次排序过程中将第一个数字和最小的数字位置互换;第二次排序过程中,将第二个数字和剩下的数字中最小的数字位置互换;依此类推,每次都将下一个数字和剩余的数字中最小的数字进行位置互换,直到将一组数字按从小到大排序。时间复杂度:O(n^2),空间复杂度:O(1),算法稳定性:不稳定代码:void SelectSort(int *arr,int len) { int i; int j; ...
渗透测试自学日志之漏洞复现篇:漏洞列表
复现成功的漏洞列表,有复现方式,各位可以参考。 网络安全,人人有责,使用本文进行非法活动,与本人无关
冒泡,选择,插入,希尔排序
假设排升序,第一个数自然是有序的,第二个数与第一个数比较,如果比第一个数小就与其交换,然后看第三个数,此时前两个数是有序的,第三个数先于第二个数比较,比第二个数小就与其交换,再与第一个数比较,比第一个数小就与其交换,如果不比第二个数小就看第四个数,此时前三个数都是有序的以此类推。直接插入排序是和距离为1的元素比较,而希尔排序是和距离为gap的元素比较,gap不断变小,直到变为1,此时即是直接插入排序。当数据全都有序时,最快。从时间上讲,gap越大,大的数可以越快的到后面去,小的数可以越快的到前面去。
告别代码丢失!用Git+Gitee管理你的Keil5单片机项目(保姆级图文教程)
本文详细介绍了如何利用Git和Gitee高效管理Keil5单片机项目,解决嵌入式开发中的代码丢失问题。通过精准配置.gitignore文件、设计适合团队的协作流程以及搭建安全备份体系,开发者可以轻松实现版本控制,提升工作效率。特别针对Keil工程的特殊文件类型,提供了实用的过滤规则和操作技巧。
RK3568_Android15适配以太网网卡gmac+国产phy芯片YT8531
本文介绍了在Android15 SDK上适配正点原子ATK-DLRK3568开发板网卡的过程。开发板采用GMAC接口搭配YT8531C PHY芯片,包含两个千兆网口。主要内容包括:硬件原理图确认、网络链路连接方式、内核DTS配置(包括GMAC0和GMAC1的参数设置)、PHY驱动适配(基于motorcomm.c驱动文件)、PHY寄存器读写调试方法以及MAC地址设置方式。文章还分析了常见问题,如网卡注册后无法ping通网络的故障现象。通过详细的硬件确认和软件配置,实现了双网卡在Android系统上的完整适配。
八大排序(一)冒泡排序,选择排序,插入排序,希尔排序
从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。如果待排序序列的初始状态恰好是我们希望的排序结果(如升序或降序),一趟扫描即可完成排序。所需的关键字比较次数C和记录移动次数M均达到最小值:冒泡排序最好的时间复杂度为O(n)。
C#实现鼠标点击任意绝对位置(附完整源码)
C#实现鼠标点击任意绝对位置(附完整源码)
冒泡快排选择插入希尔排序
1.选择排序 每次把未排序的数组中的最小值放到当前位置。循环一定次数就达到了排序效果 public static void main(String[] args) { int[] nums = {9, 5, 2, 7, 1}; for (int i = 0; i < nums.length - 1; i++) { for ...
PyTorch深度学习实战(1)——神经网络与模型训练过程详解
在本节中,我们将了解传统机器学习与人工神经网络间的差异,并了解如何在实现前向传播之前连接网络的各个层,以计算与网络当前权重对应的损失值;实现反向传播以优化权重达到最小化损失值的目标。并将实现网络的所有关键组成——前向传播、激活函数、损失函数、链式法则和梯度下降,从零开始构建并训练了一个简单的神经网络。
IDEA的使用指南
IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.
插入,冒泡,选择,希尔排序
希尔排序 int[] array={}; int count = array.length; for(int dk=count/2;dk>0;dk=dk/2){ //dk增量 for(int i=0;i<dk;i++){ //直接插入排序 for(int j=i+dk;j<count;j+=dk){ if(array[j]<array[j-dk]){ //如果相邻的两元素,...
jre9下载 jdk9
(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】
【JavaSE与数据结构】排序算法之冒泡排序,选择排序,插入排序与希尔排序
本篇文章带大家认识排序算法——冒泡排序,选择排序,插入排序与希尔排序,其中冒泡排序,选择排序,插入排序是基础的排序算法,希尔排序是插入排序的优化,四种排序算法全部都是基于比较的排序算法,本文将以图解动图的方式描述算法实现过程,实现代码为java。
老版QQ原生表情gif动态
这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。
NTscan扫描工具
ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。
冒泡排序,选择排序,插入排序,希尔排序
冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端 算法描述 比较相邻的元素。如果第一个比第二个大,就交换它们两个; 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数; 针对所有的元素重复以上的步骤,除了最后一个; 重复以上步骤,
排序算法:冒泡排序、插入排序、选择排序、希尔排序
目录 一、冒泡排序: 二、插入排序: 三、选择排序: 四、希尔排序: 一、冒泡排序: 1、算法原理: 冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系的要求。如果不满足就让它俩互换位置。一次冒泡会让至少一个元素移动到它应该在的位置,重复n次,就完成了n个数据的排序工作。 2、算法描述: (1)比较相邻的元素。如果第一个比第二个大,就交换它们两个; (2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数
数据结构——冒泡、选择、插入和希尔排序
数据结构——排序 第一篇 求点赞收藏关注!!!
排序算法一之冒泡 选择 插入 希尔排序
冒泡排序:就是交换相邻的两个数,每次m
【数据结构】冒泡、选择、插入、希尔排序的实现
本文介绍了四种基础排序算法:冒泡排序通过相邻元素比较交换将最大元素移到末尾;选择排序每次遍历选择最小/最大元素交换到起始/末尾位置;插入排序构建有序序列并逐个插入未排序元素;希尔排序是插入排序的优化,通过gap分组预排序提升效率。每种算法均包含思想描述、具体步骤和C语言实现代码,其中冒泡排序和选择排序还提供了优化版本。这些算法虽然时间复杂度较高(多为O(n²)),但作为基础排序方法,对理解更复杂算法具有重要意义。
冒泡排序、插入排序、希尔排序、选择排序
而选择排序中的“选择”是指不断从无序序列中选择最小的值放入到有序序列的最后的位置,换句话说就是从现有的无序序列中找出那个最小的值,然后与无序序列的第一个值进行交换,然后缩小无序序列的范围即可。因为有序序列的最后一个值与无序序列的第一个值紧挨着,交换后,这个无序序列中的第一个值就成了有序序列的最后一个值。每一轮插入都会取出无序数列中的第一个元素插入到有序数列中,这个插入的过程其实就是一个比较交换的过程,如果要插入的值比前面的值要小,就要交换,直到不能交换为止。在博客的开头的,我们先给出排序协议的定义。
冒泡,选择,插入,希尔排序算法
一、冒泡排序 1、算法步骤 比较相邻的元素,如果第一个比第二个大,就交换他们的位置 对每一对相邻元素做同样的操作,从开始第一对到结尾的最后一对处理完,最后的元素为最大的元素 重复以上的步骤,最后比较元素为从最后一个元素依次递减。直到没有元素比较 2、java代码 public class MaoPaoSort { public static void main(String[] args) { int[] arr = {5,2,4,10,0,3,1}; maop
探索数据结构:冒泡,选择,插入,希尔排序的实现与应用
这篇博客将介绍数据结构中常用的排序算法。排序算法在计算机科学中扮演着重要角色,能够将数据按照特定的顺序进行排列。我们将深入探讨各种排序算法的原理、复杂度分析和应用场景,包括冒泡排序、选择排序、插入排序、归并排序等。通过阅读博客,您将深入了解这些算法的实现方式和它们之间的差异,从而更好地理解和应用排序算法。
python 冒泡、选择、插入、希尔排序算法
冒泡、选择、插入、希尔排序算法 冒泡排序: 冒泡排序的时间复杂度是O[n*n],是一种最简单的,最暴力的排序方法。它的工作原理是每次循环两两比较,将将大的值一次往后边放,最后完成升序排序。代码如下: def bubble_sort(nums): for i in range(len(nums) - 1): # 这个循环负责设置冒泡排序进行的次数(比如说n个数,则只要进行n-1次冒泡,就可...
3533



被折叠的 条评论
为什么被折叠?



