【数据结构与算法 03】直接插入排序

算法思想(从小到大排序)

  • 将待排序数组看左右两个序列,左序列有序,有序列无序。
  • 假设第一个数array[0]为有序列,那么array[1,N-1]为无序列.循环遍历无序列,找出array[i]在有序列中应该插入的位置,插入。
  • 例如一个乱序数组为{1,3,2,4 , 假如有序列为 { 1,3 } 无序列循环到2时 ,那么2在有序列中的位置应该是1 - 3 中间 , 所以 [ 3. . .2 ) 之间的所有数据右移 , 即3右移的2的位置 , 腾出了3原先所在的位置 , 由2替代

博客地址:http://blog.csdn.net/mkrcpp/article/details/39320797

import java.util.Arrays;

/***
 * @title 直接插入排序
 * @author michael.mao
 * @date 2014年9月16日 下午1:59:04
 * @version V1.0
 */
public class InsertSort
{
	/***
	 * @title 直接插入排序
	 * @description 将待排序数组看左右两个序列,左序列有序,有序列无序。
	 *              假设第一个数array[0]为有序列,那么array[1,N-1]为无序列.循环遍历无序列,找出array[i]
	 *              在有序列中应该插入的位置,插入。<br/>
	 *              例如一个乱序数组为{1,3,2,4 , 假如有序列为 { 1,3 } 无序列循环到2时 ,
	 *              那么2在有序列中的位置应该是1 - 3 中间 , 所以 [ 3. . .2 ) 之间的所有数据右移 , 即3
	 *              右移的2的位置 , 腾出了3原先所在的位置 , 由2替代
	 * @author michael.mao
	 * @date 2014年9月16日 下午2:08:40
	 * @version V1.0
	 */
	public static void execute(int[] array)
	{
		// 待插入的位置
		int tmpV, j = 0;
		// 循环无序列,次数为 N-1,默认有序列为 {array[0]}
		for (int i = 1; i < array.length; i++)
		{
			// 保存待插入的值
			tmpV = array[i];
			// 在有序列中找到合适的位置
			for (j = 0; j < i; j++)
				if ( array[i] < array[j] )
					break;
			// 如果array[i]比有序列中任何一个都大,则j退出循环时, j == i,则array[0,i]为有序列,无需插入
			if ( j != i )
			{
				// 将[j,i-1]顺序右移,腾出array[j]位置
				for (int k = i - 1; k >= j; k--)
					array[k + 1] = array[k];
				// 插入
				array[j] = tmpV;
			}
			System.err.println(i + "----" + Common.print(array));
		}
	}

	// 循环测试次数
	public static int LOOP_COUNT = 1;
	public static int ARRAY_SIZE = 7;

	public static void main(String[] args)
	{
		int[] mArray = Common.getArray(ARRAY_SIZE);
		int allTime = 0;
		for (int i = 0; i < LOOP_COUNT; i++)
		{
			// 拷贝数组
			int[] tmpArray = Arrays.copyOf(mArray, ARRAY_SIZE);
			Common.print(tmpArray);
			long tmpTime = System.currentTimeMillis();
			execute(tmpArray);
			Common.print(tmpArray);
			allTime += System.currentTimeMillis() - tmpTime;
		}
		System.err.println("数组大小为(" + ARRAY_SIZE + ")的" + LOOP_COUNT + "次插入排序的平均耗时为:" + allTime / (float) LOOP_COUNT);
	}
}
1----58 80 15 27 01 68 43
2----15 58 80 27 01 68 43
3----15 27 58 80 01 68 43
4----01 15 27 58 80 68 43
5----01 15 27 58 68 80 43
6----01 15 27 43 58 68 80
数组大小为(10000)的100次直接插入排序的平均耗时为:17.58 ms
时间: 2024-08-11 03:41:52

【数据结构与算法 03】直接插入排序的相关文章

【数据结构与算法】直接插入排序

直接插入排序的时间复杂度的O(N^2),空间复杂度是O(1). 下面是代码: /** * 源码名称: InsertionSort.java * 日期:2014-08-11 * 程序功能:直接插入排序 * 版权:[email protected] * 作者:A2BGeek */ public class InsertionSort { public void insertionSort(int[] in) { int length = in.length; int i, j; for (i = 1

Hark的数据结构与算法练习之插入排序

算法说明: 先是拿语言进行一下描述: 假如是做降序排序,那么从头开始扫描每个数字,使每个数字与它前面的若干数字进行比较,直接找到小于当前数字a(当前数字以a代替)的数字b(小于a的数字以b代替). 然后将数字a插入到数学b的位置.将数字b到数字a前一位的数字向后移动一位. 至此,排序结束. 语言表述其实懂这个算法的人能会懂,不懂这个算法的人不太容易看懂,所以还是以例子做一下说明: 例如有一个数组int[] arrayData = { 5, 9, 6, 7, 4, 1, 2, 3 ,8},一共9个

研磨数据结构与算法-03栈与队列

一,栈 public class MyStack { //底层实现是一个数组 private long[] arr; private int top; /** * 默认的构造方法 */ public MyStack() { arr = new long[10]; top = -1; } /** * 带参数构造方法,参数为数组初始化大小 */ public MyStack(int maxsize) { arr = new long[maxsize]; top = -1; } /** * 添加数据

[数据结构与算法 03] 最好、最坏、平均、均摊 时间复杂度

由来 /**** 在一个无序的数组(array)中 查找变量 x 第一次出现的位置.如果没有找到,就返回 -1 ****/ // n 表示数组array的长度 int find(int[] array, int n, int x) { int i = 0; int pos = -1; for (; i < n; ++i) { if (array[i] == x) pos = i; } return pos; } 分析出此函数的时间复杂度为 O(n) 在数组中查找一个数据,并不需要每次都把整个数组

[数据结构和算法]折半插入排序算法笔记

/// <summary> /// 步骤: /// 1.记录当前待排元素 /// 2.标记顺序表有序查找区域下界和上界 /// 3.在顺序表有序查找区域中折半查找等待排序元素的位置 /// 4.把顺序表有序查找区域的某些元素后移一位,以空出位置给等待排序的元素 /// 5.在空出的位置填写当前排序元素 /// </summary> /// <param name="elements"></param> static void SqList

《数据结构与算法之美》——冒泡排序、插入排序、选择排序

排序,是每一本数据结构的书都绕不开的重要部分. 排序的算法也是琳琅满目.五花八门. 每一个算法的背后都是智慧的结晶,思想精华的沉淀. 个人觉得排序算法没有绝对的孰优孰劣,用对了场景,就是最有的排序算法. 当然,撇开这些业务场景,排序算法本身有一些自己的衡量指标,比如我们经常提到的复杂度分析. 我们如何分析一个算法? 排序算法的执行效率 1.最好.最坏和平均情况的时间复杂度 2.时间复杂度的系数.常数和低阶 一般来说,在数据规模n很大的时候,可以忽略这些,但是如果我们需要排序的数据规模在几百.几千

JavaScript 数据结构与算法之美 - 冒泡排序、插入排序、选择排序

1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习. 之所以把冒泡排序.选择排序.插入排序放在一起比较,是因为它们的平均时间复杂度都为 O(n2). 请大家带着问题:为什么插入排序比冒泡排序更受欢迎 ?来阅读下文. 2. 如何分析一个排序算法 复杂度分析是整个算法学习的精髓. 时间复杂度: 一个算法执行所耗费的时间. 空间复杂度:

《数据结构与算法之美》 &lt;03&gt;数组:为什么很多编程语言中数组都从0开始编号?

提到数组,我想你肯定不陌生,甚至还会自信地说,它很简单啊. 是的,在每一种编程语言中,基本都会有数组这种数据类型.不过,它不仅仅是一种编程语言中的数据类型,还是一种最基础的数据结构.尽管数组看起来非常基础.简单,但是我估计很多人都并没有理解这个基础数据结构的精髓. 在大部分编程语言中,数组都是从 0 开始编号的,但你是否下意识地想过,为什么数组要从 0 开始编号,而不是从 1 开始呢? 从 1 开始不是更符合人类的思维习惯吗? 你可以带着这个问题来学习接下来的内容. 如何实现随机访问? 什么是数

数据结构与算法20170804

本文介绍数据结构与算法的知识,相信很多人在学校都学习过,同时为了贴近实际,文章直接附上编译通过可直接使用的源码. 一.数据结构 1.线性表: 1)带头结点的链表 1 /***************************************************************************** 2 * Copyright (C) 2017-2018 Hanson Yu All rights reserved. 3 ---------------------------