每日一练(1)插入排序算法

时间:2022-04-19 22:16:56
  • 插入排序算法

1. 简单介绍

1.1 排序

什么是排序?字如其意。就是将一串数字以一定的顺序排列。
排序是一个操作,也是一个事件。这便有“时间,地点,人物,起因,经过,结果”这事件的六大要素。在这个排序的过程中,这6个要素分别具体代表什么,下面容我慢慢分析。

时间:算法消耗掉时间,通常有运行时间,编译时间,读取io数据的时间等等;
地点:计算机内部;(很多时候是这样吧,当然也存在路由的情况)
人物:操作的数据,数据可能是内存内,也可能在任何存储介质之内;
起因/经过/结果:算法操作;

其中,一个算法通常有输入和输出,输入又分为值输入和引用输入,这造成的结果就是原数据改变和原数据不变的情况;

插入排序算法,是排序算法的一种。排序算法就是将一个数据集进行一系列操作,改变其中数据的排列顺序。
为了方便,我们在讲解排序算法的时候就以如下一组无序算法进行讲解。

[1,5,9,2,3,19,0,2]

注意:
这组数据集中的数据是有重复的,这会造成排序中常说的绝对位置改变和未改变。
简单来说,这边有两个数字2;分别记作2(1),2(2)。
排序完成后可能出现:
情况1: 2(1),2(2); 情况2: 2(2),2(1);
我们通常将情况1称为绝对位置未改变,情况2喂绝对位置改变。

1.2 插入排序原理

算法导论中是以这样的例子引题的:
一个人在抽牌。第一张抽中数字3,将其放在1号位;第二张抽中数字2 ,将数字2放置在1号位,数字3变为2号位;第三张抽中数字1,将数字1放在1号位,数字2放在2号位,数字3放在3号位;
仔细想想大家会发现,每次多一张牌,这张牌会放在原有序序列的某一处。就好像插入其中一张,算法因此得名。
这个算法有一个重要特性是,抽n张牌的时候,之前的n-1张牌都是有序的。

1.3 算法实现

伪代码:

Java代码:

package com.us.demo.rule;

public class Rule01 {

public static void main(String []args){
int []array={1,5,9,2,3,19,0,2};
//System.out.println(array.length); //length 就是数组中数字的个数
// 这边是直接改变原来的数组
// int i=1;i<array.length;i++ 这边直接从1开始可以少进行一次的计算
for(int i=1;i<array.length;i++){
int tmp=array[i];//tmp 即待插入的数字
int j=i;
while((j>0)&&(array[j-1]>tmp)){
array[j]=array[j-1];
j--;//注意这边j最小为0 用j>0来保证array[j-1] 不会指向一个空的位置
}
array[j]=tmp;
}

//查看排序结果
for(int i=0;i<array.length;i++){
System.out.print(" "+array[i]);
}
//仔细想想 其中2(1) 2(2)的觉得位置并没有发生改变
}
}

ps:真的是框架写多了,人会对某些框架有些依赖。算法也好久没有写了,慢慢拾起来吧。。