排序算法第一篇——插入排序
算法描述:
从一个无序的集合中取出一个元素,插入到一个有序的集合的合适位置,有序的集合插入新元素之后,仍然是有序的。所以该算法最核心的部分是要在有序集合中找到合适的插入位置。
Java代码:
package ljp.sort.insert; public class InsertSortDemo01 { private int[] list; public InsertSortDemo01(int[] list){ this.list = list; } public void sort(){ int count = 0;//排序次数 for(int i = 1;i<list.length;i++){ for(int j = 0;j<i;j++){ if(list[i]<list[j]){ int temp = list[i]; for(int k = i;k>j;k--){ list[k] = list[k-1]; } list[j] = temp; } } System.out.println("第"+ ++count +"次排序:"); display(); } } public void display(){ for(int i:list){ System.out.print(i+" "); } System.out.println(); } public static void main(String[] args) { int[] list = new int[10]; for(int i = 0;i<list.length;i++){ list[i] = (int) (Math.random()*1000); } InsertSortDemo01 sort = new InsertSortDemo01(list); System.out.println("排序前:"); sort.display(); sort.sort(); } }
运行结果:
排序前:
300 748 262 274 284 263 135 283 388 477
第1次排序:
300 748 262 274 284 263 135 283 388 477
第2次排序:
262 300 748 274 284 263 135 283 388 477
第3次排序:
262 274 300 748 284 263 135 283 388 477
第4次排序:
262 274 284 300 748 263 135 283 388 477
第5次排序:
262 263 274 284 300 748 135 283 388 477
第6次排序:
135 262 263 274 284 300 748 283 388 477
第7次排序:
135 262 263 274 283 284 300 748 388 477
第8次排序:
135 262 263 274 283 284 300 388 748 477
第9次排序:
135 262 263 274 283 284 300 388 477 748
算法分析:
在最坏的情况下,内层循环的次数为i才可以找到合适的插入位置,每一次排序,对于一个元素为n的集合,都需要循环n-1次,所以
T(n) = 1 + 2 + ······ + n-1 = O(n^2)
最好的情况下,内层循环的次数为0次就可以找到合适的插入位置,所以总循环次数(不算插入操作时以为的循环)为
T(n) = 1 + 1 + ······ + 1 = n-1 = O(n)
在平均情况下,插入位置随机出现,假设出现的概率相等,这样子内层循环的次数平均为i/2。所以排序总循环次数(不算插入操作时以为的循环)为
T(n) = 1/2 + 2/2 + ······ + (n-1)/2 = (n-1)n/4 = O(n^2)
所以该算法的时间复杂度为O(n^2)。
原地排序:原地排序是指排序过程中不使用临时空间,即排序前和排序后元素都在同一地方的排序。
根据原地排序的定义,插入排序也是一种原地排序。
排序算法稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。
从排序算法稳定性的概念来看,插入排序算法是稳定的。
转载于:https://www.cnblogs.com/JPAORM/archive/2012/04/10/2510090.html
排序算法第一篇——插入排序相关推荐
- php代码编写直接插入排序算法,PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析...
本文实例讲述了PHP排序算法之直接插入排序(Straight Insertion Sort).分享给大家供大家参考,具体如下: 算法引入: 在这里我们依然使用<大话数据结构>里面的一个例子 ...
- 插入排序 php,PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析
本文实例讲述了PHP排序算法之直接插入排序(Straight Insertion Sort).分享给大家供大家参考,具体如下: 算法引入: 在这里我们依然使用<大话数据结构>里面的一个例子 ...
- 插入排序java_排序算法之直接插入排序Java实现
排序算法之直接插入排序 舞蹈演示排序: 冒泡排序: http://t.cn/hrf58M 希尔排序:http://t.cn/hrosvb 选择排序:http://t.cn/hros6e 插入排序:ht ...
- 排序算法(2)直接插入排序
排序算法(2)直接插入排序 原理:将数组中的所有元素依次和前面的已经排好序的元素相比较(依次) ,如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过. 代码实现: void InsertS ...
- 排序算法第二篇——折半插入排序
算法描述: 在上一篇插入排序算法中,已经提到,插入排序的核心是在有序的集合中找到要插入的位置.所以,在这里介绍一种对插入排序的改进算法,即折半插入排序.折半插入排序是指利用折半查找的算法,在有序集合中 ...
- 【Java】5大排序算法总结(插入排序+希尔排序+选择排序+堆排序+冒泡排序)
快速导航: 1. 稳定性 2 . 插入排序 3. 希尔排序 4. 选择排序 5. 堆排序 6 冒泡排序 1. 稳定性 两个相等的数据,如果经过排序后,排序算法能保证其相对位置不发生变化,则我们称该算法 ...
- 各种排序算法总结篇(高速/堆/希尔/归并)
1.高速排序 交换排序有:冒泡(选择)排序和高速排序,冒泡和选择排序的时间复杂度太高,思想非常easy临时不讨论.高速排序基于一种分治的思想,逐步地使得序列有序. #include <iostr ...
- C/C++排序算法(1)直接插入排序
常见排序算法总结(1)直接插入排序 一篇文章,带你搞懂 插入排序 (注:代码语言的选择不应该限制了我们对算法的理解) (1)算法原理 插入排序是一种最简单直观的排序算法,思想就是,从第二个数开始(下标 ...
- 排序算法之简单插入排序法
对于初学者来说,排序算法是C语言学习的一个重点和难点,我就来分享一下我的学习心得吧! 排序算法有3类:1.交换类排序法.包括冒泡排序和快速排序 2.插入类排序法.包括简单插入排序和希尔排序 3.选择类 ...
最新文章
- Linux存储的基本管理
- 如何用R语言在机器学习中建立集成模型?
- PowerShell runspace 的创建,使用和查错
- iOS - 数据持久化之 FMDB 的使用
- vconsole插件_移动端调试面板插件vconsole
- linux 计算标准差,Azure Linux VM 的计算基准测试分数 - Azure Virtual Machines | Microsoft Docs...
- CSV 导入SQL Server(bulk insert方式)
- 大数据十大核心原理(互联网上整理)
- 纳韦斯托克斯方程的推导_什么是纳维-斯托克斯方程?
- SQL 语句,聚沙成塔
- python读取163邮件内容_python 3.x 163邮箱登陆,邮件读取
- Nginx配置https(ssl证书)并反向代理Springboot Jar项目
- C语言 写一个函数求两个数的较大值
- 3. 搞定收工,PropertyEditor就到这
- Time Series FeatuRe Extraction on basis of Scalable Hypothesis tests (tsfresh –A Python package)
- Excel.cpp和Excel.h的获取
- Axon Framework简介
- 20级网络学生---循环
- 一边攒大米,一边做公益
- 芯片验证自学,IC验证自学入门教程:ASIC芯片设计流程讲解