首页 > 编程语言 >算法回顾之二:直接插入排序

算法回顾之二:直接插入排序

时间:2023-09-14 14:33:55浏览次数:39  
标签:int 插入排序 元素 无序 之二 算法 有序 表中 排序


算法回顾系列第二篇:直接插入排序算法

-------------------------------------------

直接插入排序

基本原理:

把n个待排序的元素看成为一个有序表和一个无序表。

开始时有序表中只包含一个元素,无序表中包含有n-1个元素。排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。

程序实现:

public void sort(int[] data) {
	int temp;
	for(int i=1;i<data.length;i++){//已排序(有序表)的元素个数(第一个元素默认看作已排序).
		//有序表的下一个元素(j)如果小于已排序的最大元素(j-1),则交换位置.
		//如此向前(j--)与每个元素比较直到找到小于它的元素(data[j]<data[j-1])或者到第一个元素(j>0).
		for(int j=i; (j>0)&&(data[j]<data[j-1]); j--){//for的初始化条件j=i只执行1次.
			temp = data[j];
			data[j] = data[j-1];
			data[j-1] = temp;
		}
		System.out.println("Sort"+i+":"+Arrays.toString(data));//每趟排序后的结果.
	}
}

上面程序中:

外层循环i代表已经排序的元素个数(即有序表的元素个数)。从1开始计数,表明第一个元素默认是有序的。

内层循环j代表无序表的第一个元素,j-1即有序表的最后一个元素。两个元素比较:

如果无序表的第一个元素大于有序表的最后一个元素,则结束本趟排序(因为有序表的最后一个元素一定是最大的,无序表的第一个元素如果比它还大,不需要交换位置)。

如果无序表的第一个元素小于有序表的最后一个元素,则交换位置,然后继续与有序表的倒数第二个元素进行比较,直到找到有序表中比它小的元素或者它排在了第一个时,结束本趟排序。

如此直到排序完N-1个元素(第一个元素无需排序)。

 

性能分析:

1、待排序元素已从小到大排好序(正序)或接近排好序时,所用的比较次数和移动次数较少;

2、当待排序元素已从大到小排好序(逆序)或接近排逆序时,所用的比较次数和移动次数较多。

最坏时间复杂度:O(n^2)

 

空间复杂度:1。

稳定性:稳定的排序。

 

标签:int,插入排序,元素,无序,之二,算法,有序,表中,排序
From: https://blog.51cto.com/u_6978506/7470123

相关文章

  • C#(4):语言基本元素、类型、变量、方法、算法
     穿插算法和数据结构var类型可以根据复制自动推断变量属性    应为get或set访问器:方法名没加括号变量和方法(循环,递归)usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceClassMethodExample{classProgra......
  • 设计模式回顾之二:外观/门面模式(Facade)
    设计模式回顾系列文章:主要针对工作中常用常见的设计模式进行整理、总结,同时分享以供大家拍砖。------------------------------------------------外观/门面模式(Facade)希望简化原有系统的使用方式,需要定义自己的接口。Facade模式简化了对所需子系统的使用过程,但是由于Facade并不......
  • 算法回顾之三:二分查找
    算法回顾系列第三篇:二分查找算法------------------------------------------------二分查找算法 基本原理:首先,假设表中元素是按升序排列.将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功.否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键......
  • 代码随想录算法训练营第9天| ●28. 实现 strStr() ●459.重复的子字符串 ●字符串总结
    28.找出字符串中第一个匹配项的下标mydemo--(mythought)--(falied)classSolution{public:intstrStr(stringhaystack,stringneedle){for(inti=0;i<haystack.size();i++){if(haystack[i]!=needle[0])continue;......
  • 逆向使用的公共加密解密的方法与算法
    python的AES加密解密方法-ECB模式fromCrypto.CipherimportAESimportbase64fromCrypto.Util.Paddingimportunpad,paddefdecrypt_aes(ciphertext,key):ciphertext=base64.b64decode(ciphertext)#使用base64解码密文cipher......
  • 代码随想录算法训练营第8天| ● 344.反转字符串 ● 541. 反转字符串II ● 剑指Offer 0
    344.反转字符串mydemo--(一次就过)--(成功)classSolution{public:voidreverseString(vector<char>&s){intlen=s.size();chartmp;inti=0;intj=len-1;while(i<j){tmp=s[i];......
  • 数据挖掘的十大经典算法?
    数据挖掘是从大量数据中发现隐藏模式、关联和知识的过程。以下是十大经典算法,它们被广泛应用于数据挖掘任务,并且每个算法都有其独特的优势和适用场景。1.决策树(DecisionTree):决策树是一种基于树结构的分类和回归方法。它通过使用属性选择指标构建树,在每个节点上进行分裂,以递归......
  • 代码随想录算法训练营第七天
    代码随想录算法训练营第七天|LeetCode344(反转字符串)LeetCode541(反转字符串II)LeetCode剑指05(替换空格)LeetCode151(反转字符串中的单词)LeetCode剑指58(II.左旋转字符串)344:反转字符串LeetCode344(反转字符串)思路:双指针遍历直接交换元素classSolution......
  • 数据分享|R语言逻辑回归、Naive Bayes贝叶斯、决策树、随机森林算法预测心脏病|附代码
    全文链接:http://tecdat.cn/?p=23061最近我们被客户要求撰写关于预测心脏病的研究报告,包括一些图形和统计输出。这个数据集可以追溯到1988年,由四个数据库组成。克利夫兰、匈牙利、瑞士和长滩。"目标"字段是指病人是否有心脏病。它的数值为整数,0=无病,1=有病数据集信息:目标:主......
  • Lnton羚通算法算力云平台工服识别算法、工装穿戴检测系统着装合规检测识别系统实际应
    Lnton羚通的算法算力云平台是一款出色的解决方案,具备突出的特点。该平台提供高性能、高可靠性、高可扩展性和低成本的功能,使用户能够高效地执行各种复杂的计算任务。此外,平台还提供了丰富的算法库和工具,支持用户上传和部署自定义算法,提高了平台的灵活性和个性化能力。工服识别检测......