insertion_sort

算法:排序算法之插入排序 在前一篇《算法:排序算法之冒泡排序》中,我们已经对冒泡排序做了解析说明,本节我们将继续对排序算法(插入排序)进行相关解析说明。 排序算法系列目录说明 冒泡排序(Bubble Sort) 插入排序(Insertion Sort) 希尔排序(Shell Sort) 选择排序(Selection Sort) 快速排序(Quick Sort) 归并排序(Merge Sort) 堆排序(Hea... 阅读详情

       现在来讲下插入排序。

       输入:a1,a2...an。用数组a[n]来存储。

       输出:将n个数按升序排列。

       实现的代码如下:

       第一种(有监视哨):

#include<iostream>
using namespace std;

void insertion_sort(int a[],int n)   //插入排序
{
	int i,j;
  
	for(i=2;i<=n;i++)   //n-1次插入操作
	{
		a[0]=a[i];     //a[0]是监视哨

		for(j=i-1;j>=0;j--)
		{
			if(a[j]>a[0])
				a[j+1]=a[j];
			else
			{
				a[j+1]=a[0];
				break;
			}
		}
	}
}
		
int main()
{
	int a[101];
	int i,n;

	while(cin>>n,n)
	{
		for(i=1;i<=n;i++)
			cin>>a[i];
		
		insertion_sort(a,n);
		
		for(i=1;i<=n;i++)
			cout<<a[i]<<" ";

		cout<<endl<<endl;
	}

	return 0;
}

         其中,函数insertion_sort(),也可用以下这个:

void insertion_sort(int a[],int n)
{
	int i,j;

	for(i=2;i<=n;i++)  //n-1次插入操作
	{
		a[0]=a[i];    //用a[0]来做监视哨,很巧妙
		j=i-1;

		while(a[j]>a[0])
		{
			a[j+1]=a[j];
			j--;
		}

		a[j+1]=a[0];
	}
}


          第二种(无监视哨):

#include<iostream>
using namespace std;

void insertion_sort(int a[],int n)
{
	int i,j,tem;

	for(i=1;i<n;i++)  //n-1次插入操作
	{
		tem=a[i];   //待插元素
		j=i-1;

		while(j>=0 && a[j]>tem)   //寻找位置,j>=0是数组越界检查
		{
			a[j+1]=a[j];
			j--;
		}
		a[j+1]=tem;
	}
}

int main()
{
	int a[100];
	int i,n;

	while(cin>>n,n)
	{
		for(i=0;i<n;i++)
			cin>>a[i];

		insertion_sort(a,n);

		for(i=0;i<n;i++)
			cout<<a[i]<<" ";

		cout<<endl<<endl;
	}

	return 0;
}

 

          个人觉得插入排序是一种比较基础的排序方法。思想也并不难理解。也就是将数组a[n]分为a[1...j-1]和a[j...n]两部分,其中a[1...j-1]已排序,而a[j...n]待排序。

     那么,每次从a[j...n]中取出最前的数,并将其插入到a[1...j-1]中。这样的话a[j...n]的规模不断减小,而a[1...j-1]的规模则不断增大。直到数据全部排序。

           Attention:

           ①插入排序是原地排序。基本上是在原有数组上操作,只需少量的辅助空间,如key和a[0]。

           ②插入排序的空间性能是O[n^2]的,空间性能为O[n]。

           ③插入排序每插入一个数,只是暂时确定该数在数组中的位置,也就是说每次插入不能确定一个数的最终位置。

           ④以上提到两种方法,有无监视哨,监视哨存在的主要目的就是避免数组下标越界检查。值得注意的是:如用a[0]作为监视哨,则a[0]不能存储有用数据。

告别黑盒调试:用MMSegmentation可视化工具链,从训练到评估一目了然 本文介绍了如何利用MMSegmentation的可视化工具链,从训练到评估实现语义分割模型的透明化调试。通过整合日志分析、混淆矩阵、PR曲线等工具,开发者可以快速定位模型问题,优化性能。文章详细展示了训练曲线分析、性能剖析、混淆矩阵解读和PR曲线应用等关键步骤,帮助用户告别黑盒调试,提升模型开发效率。 阅读详情

相关推荐

【Cadence】PSS+PSTB/PAC仿真在开关电源稳定性分析中的关键应用

本文深入探讨了Cadence仿真工具中PSS+PSTB/PAC方法在开关电源稳定性分析中的关键应用。针对开关电源作为时变非线性系统的特性,传统STB仿真方法会失效。文章详细阐述了如何通过PSS分析找到周期稳态,并在此基础上利用PSTB或PAC进行精确的环路增益和小信号频响分析,为电源设计提供可靠的稳定性评估与补偿网络设计依据。

weixin_29276847的博客 528

插入排序(Insertion Sort)

theory 原理讲解来源于文章 https://www.runoob.com/data-structures/insertion-sort.html 1、概念及其介绍 插入排序(InsertionSort),一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增 1 的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找

鱼香肉丝没有鱼的博客 1万+

Python爬虫实战:巧用HEAD请求和Cookie令牌绕过沃尔玛反爬(附完整代码)

本文详细介绍了如何利用Python爬虫技术,通过HEAD请求和Cookie令牌绕过沃尔玛的反爬机制。文章深入解析了人机验证系统的运作原理,并提供了完整的工程化实现代码,包括令牌池设计、高并发架构和异常处理策略,帮助开发者高效采集电商数据。

weixin_29046035的博客 1013

插入排序(C语言)

如果是进行相对有序的数组,效率会非常高。不占额外空间,是一种稳定的算法。时间复杂度高,遇到数据过多的情况下不是很适用。输入10个数字并将其从小到大排。

ikun10001的博客 2861

AD9361 官方例程详解(一)

文章目录前言一、pandas是什么?二、使用步骤总结 前言 一、pandas是什么? 二、使用步骤 总结

weixin_44630490的博客 4万+

深入解析BlueZ5与D-Bus:Linux蓝牙开发实战指南

本文深入解析BlueZ5与D-Bus在Linux蓝牙开发中的核心应用,提供从环境搭建到实战开发的完整指南。通过详细代码示例和调试技巧,帮助开发者掌握蓝牙协议栈与D-Bus接口的交互方法,实现高效蓝牙设备管理与GATT服务开发。

weixin_28292761的博客 452

排序算法-插入排序(InsertionSort)

排序算法-插入排序(InsertionSort)-优化-希尔排序---JavaScript

dandelion_zjw的博客 1875

用R语言实现“中断时间序列分析” --- R code for ITS

ITS方法可用于评估一项干预措施的效果,从水平改变和斜率改变两个角度来描述干预引起的变化。

franksui的博客 4030

INSERTION_SORT(插入排序)

如图,左手的牌是排序好的,右手的牌是将要进行排序的。i = j - 1 // i 为要插入的元素的前一个元素位置。while i > -1 and A[i] > key // 前面有序的元素都比key大插在第一个,或者找到。该算法像是在要匹配的元素位置挖一个坑,把前面比它大的元素往后填,最后把key放在正确的坑位。A[2]的插入方式跟上面情况相同,我们直接开始A[3]的排序。总的运行时间为:T(n)=

Hennan_Dianzi_C的博客 888

瑞芯微Android固件修改实战:从解包到root提权完整流程(附工具包)

本文详细解析了瑞芯微Android固件深度定制全流程,涵盖从固件包解包、系统镜像修改到植入root提权与分区调整的实战步骤。通过工具链操作与原理剖析,指导开发者安全实现系统精简、权限获取及存储扩容,最终完成固件重新打包与刷机验证,适用于追求设备完全控制权的技术爱好者。

ujm56789012的博客 699

LSF0108 level shift设计使用及debug流程

目录 初版设计 测试出现的问题1 解决问题(尝试1) 测试出现的问题2 解决问题2-1 解决问题2-2 单Port测试结果 所有Port均连接测试结果 初版设计 此电路的应用场景在于将LCD屏幕连接到FPGA上,进而通过FPGA中设计的硬件电路来驱动LCD屏幕,验证数字硬件电路设计的正确性。因此需要一个转接板位于FPGA和LCD屏幕之间,将二者连接起来。 转接板的硬件电路设计主要存在以下需求: 实现3.3V和1.8V之间的同时双向逻辑转换(LCD屏幕电平为3.3V,FPGA电平为1.

moshanghongfeng的博客 7562

sort源码及__final_insertion_sort

最近在看STL源码解析的时候,在看到SGI STL sort的部分是,对std::sort的最后一步__final_insertion_sort(插入排序),比较迷惑。 template <class RandomAccessIterator> void __final_insertion_sort(RandomAccessIterator first, ...

selfsongs 404

手把手教你用ESP32-C3打造智能聊天机器人-立创实战派

本文将详细介绍如何利用立创ESP32-C3开发板,烧录小智AI程序,快速实现一个功能强大的聊天机器人。

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 5543

Insertion Sort and Merge Sort

INSERTION-SORT(A)1 for j ← 2 to length[A]2     do key ← A[j]3 //Insert A[j] into the sorted sequence A[1..j - 1].4          i ← j - 15         while i > 0 and A[i] > key6               do A[i + 1] ← A

Pro的专栏 1280

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Algorithms - Insertion sort

印象 图1 插入排序过程 思想 插入排序(Insertion Sort)的主要思想是不断地将待排序的元素插入到有序序列中,是有序序列不断地扩大,直至所有元素都被插入到有序序列中。 分析 时间复杂度: 最优时间: O(\(n-1\)) 最坏时间: O(\(\frac{1}{2}n(n-1)\)) 平均时间: O(\(n^2\)) 代码示例 C# public static void I...

weixin_30338743的博客 122

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

当n>30时,Merge Sort的性价比由于Insertion Sort!

当n>30时,Merge Sort的性价比由于Insertion Sort!

麦田里的守望者 1740

Insertion sort algorithm

Insertion sort is an efficient algorithm for sorting a small number of elements, which costs O(n2).The operation of INSERTION-SORT on the array A = 〈5, 2, 4, 6, 1, 3〉. Array indices appear above the rectangles, and values stored in the array positions

citylove的专栏 949

INSERTION-SORT

INSERTION-SORT 升序 FOR J = 2 TO A.length key = A[j] i = j - 1 while i > 0 and A[i] > key A[I + 1] = A[I] i = i - 1 A[I + 1] = key Next 降序 for j = A.length - 1 to 1 step -1 key = A[j]...

xiaohaopei的博客 702

09-排序3 Insertion or Heap Sort (25分)(C语言

这个题判断是insert还是heap排序,判断还是比较容易但是,如果直接对已排序的数组进行下一步,最后一个测试点通过不过。。不知道为什么,新建一个数组排序到那一步能通过 #include<stdio.h> int n; int a[105],b[105],c[105]; int isinsert=0; void print(int *c) { printf("%d",c[0]); for(int i=1; i<n; i++) printf(" %d",c[i]); } bool .

Fishmanes的博客 430

Insertion Sort

 听说算法导论很牛,就下了个英文版的看看,第二章就介绍插入排序了,用Java实现了下,没实现一个就写下一个,方便以后复习,希望自己能坚持,挑些简单的看完,呵呵public class InsertionSort { public static void main(String[] args) { int[] array = {9, 3, 2, 4, 6, 8, 7};

190

图解插入排序(Insertion Sort)

插入排序(Insertion Sort) 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 算法描述 一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序; 取出下一个元素,在已经排序的元素序列中从后向...

天行健,君子以自强不息 899

insertion sort

<br />INSERTION-SORT(A)<br />1 for j ← 2 to length[A]<br />2 do key ← A[j]<br />3 ▹ Insert A[j] into the sorted sequence A[1 j - 1].<br />4 i ← j - 1<br />5 while i > 0 and A[i] > key<br />6 do A[i + 1] ← A[i]<br />7 i ← i - 1<br />8 A[i + 1] ← key

expleeve 573

【PTA】Insertion or Heap Sort (25 分)

//跟上一题基本一样 #include <iostream> #define MAXN 100001 using namespace std; int a[MAXN]; int res[MAXN]; int Insert2[MAXN],Heap2[MAXN]; int IsRight(int* A,int N){ int flag=1; for(int i=0;i<N;i++){ if(A[i]!=res[i]) flag=0; } ...

fftx_00的博客 225

LeetCode: Insertion Sort List

LeetCode: Insertion Sort List LeetCode: Insertion Sort List Sort a linked list using insertion sort. 地址:https://oj.leetcode.com/problems/insertion-sort-list/ 算法:按题目的意思,采用...

weixin_34185512的博客 188
上一篇: HDU1028 母函数
下一篇: HDU4144 TLE
lulipeng_cpp
博客等级 码龄15年 169粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值