插入算法 转载

插入排序算法是一个对少量元素进行排序的有效算法。插入排序的工作原理与打牌时整理手中的牌的做法类似,开始摸牌时,我们的左手是空的,接着一次从桌上摸起一张牌,并将它插入到左手的正确位置。为了找到这张牌的正确位置,要将它与手中已有的牌从右到左进行比较,无论什么时候手中的牌都是排序好的。

JAVA实现该算法如下:

 1 public void insertSort(int a[]){
 2         int length=a.length; //数组长度
 3         int j;               //当前值的位置
 4         int i;               //指向j前的位置
 5         int key;             //当前要进行插入排序的值
 6         //从数组的第二个位置开始遍历值
 7         for(j=1;j<length;j++){
 8             key=a[j];
 9             i=j-1;
10             //a[i]比当前值大时,a[i]后移一位,空出i的位置,好让下一次循环的值后移
11             while(i>=0 && a[i]>key){
12                 a[i+1]=a[i]; //将a[i]值后移
13                 i--;         //i前移
14             }//跳出循环(找到要插入的中间位置或已遍历到0下标)
15             a[i+1]=key;    //将当前值插入
16         }
17     }  

insertSort在数组A={5,2,4,6,1,3}上的处理过程,数组的下标出现在巨型的上方,黑色框的值即为key=a[j]。

a[i]即为a[j]左边的值,每次循环key与a[i]进行比较,如果key<a[i],则a[i]移到 i+1处,同时i--向左移动,直到找到a[i]<=key或者i<0,此时将 key插入到a[i+1]处。

问题1:a[i]第一次进行右移时覆盖了a[i+1]值,是否造成了数据丢失?

答:不会造成数据丢失,应为第一次右移前的i+1=j,此时a[j]的值存在了key里了。每次右移都为下一次右移或插入留出了位置,这就是插入排序的关键点所在。

时间: 2024-08-24 10:21:13

插入算法 转载的相关文章

房上的猫:数组插入算法等难点专开

一:查找算法 二:复制算法 三:插入算法

冒泡排序、选择排序及插入算法

一.冒泡排列 冒泡排序的原理如下,以8个数由大到小排列为例,进行说明,数据存放在数组a[8]中. 假如8个数分别为4.9.10.3.2.14.11.5. a[0]<a[1]即4<9,故交换位置,9.4.10.3.2.14.11.5 a[1]<a[2]即4<10,故交换位置,9.10.4.3.2.14.11.5 a[2]>a[3]即4>3,位置不变,继续比较 a[3]>a[4]即3>2,位置不变,继续比较 a[4<a[5]即2<14,故交换位置,9

Java中数组的几个常用算法:插入算法,删除算法,冒泡排序算法

前言: 在Java中我们常常会用数组,提到数组就不得不介绍数组中常用到的几个算法. 有插入算法,删除算法,冒泡排序算法等. 在学习这几个数组的算法前,我们先来了解一下关于数组一些基本知识. 数组的基本知识: 数组的定义:数组(Array)是相同数据类型的数据的有序集合. 数组是引用数据类型. 数组的三个特点: [1]数组长度是确定.数组一旦申请完空间,长度不能发生变化,用length属性访问. [2]数组的元素都是同一数据类型. [3]数组是有序的 .每个元素通过下标/索引标记,索引从0开始.

二叉搜索树插入算法C#演示的代码

如下内容内容是关于二叉搜索树插入算法C#演示的内容,希望能对大伙有帮助. public class BinaryTreeNode{ public BinaryTreeNode Left { get; set; } public BinaryTreeNode Right { get; set; } public int Data { get; set; } public BinaryTreeNode(int data) { this.Data = data; }} public void Inse

排序算法-(冒泡、选择、插入算法)

运行效率较慢的三大排序算法:冒泡.选择与插入算法,时间复杂度都为O(n2),运行效率较慢. #python 代码实现如下所示: li=[2,1,4,5,7,8,9,5,3]#冒泡算法(升序算法)O(n2)import randomfrom cal_time import *@cal_timedef bubble_sort(li): for i in range(len(li)-1): #第i趟 exchange=False for j in range(len(li)-i-1): #无序区域为n

插入算法

直接插入排序算法java实现 1.算法概念. 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序. 2.算法思想. 假设待排序的记录存放在数组R[1..n]中.初始时,R[1]自成1个有序区,无序区为R[2..n].从i=2起直至i=n为止,依次将R[i]插入当前的有序区R[1..i-1]中,生成含n个记录的有序区. 3.实现思路. ①用一个临时变量temp存储第i个元素(i>=1,下标从0开始). ②比较R[i] 和R[i+1],如果R[i+1].compareTo(R

浅谈MySQL索引背后的数据结构及算法(转载)

转自:http://blogread.cn/it/article/4088?f=wb1 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等.为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论. 文章主要内容分为三个部分. 第一部分主要从数据结

大白话解析模拟退火算法(转载)

优化算法入门系列文章目录(更新中): 1. 模拟退火算法 2. 遗传算法 一. 爬山算法 ( Hill Climbing ) 介绍模拟退火前,先介绍爬山算法.爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解. 爬山算法实现很简单,其主要缺点是会陷入局部最优解,而不一定能搜索到全局最优解.如图1所示:假设C点为当前解,爬山算法搜索到A点这个局部最优解就会停止搜索,因为在A点无论向那个方向小幅度移动都不能得到更优的解. 图1    

八大排序算法 (转载)

概述 插入排序直接插入排序Straight Insertion Sort 插入排序希尔排序Shells Sort 选择排序简单选择排序Simple Selection Sort 选择排序堆排序Heap Sort 交换排序冒泡排序Bubble Sort 交换排序快速排序Quick Sort 归并排序Merge Sort 桶排序基数排序Radix Sort 总结 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中