插入排序作为一种经典的排序算法,我们也是必须要掌握的。
基本思想:将未排好序的数组中将元素挨个取出来,将其与排好序的元素中,从后往前比较,若比其大就将该元素后移一位,将取得的元素插入。
原理:
1.认定A[0]已在排序好的队列中,然后从A[1]~A[n-1]挨个将元素取出来赋值给变量gain。
2.变量j=i-1,i为取出来元素的下标,此时j就为排好序列中的最大元素位置。比如取出来A[5],此时排好序列中已有5个元素排好序,所以最大的元素下标就为4,j=n-1。
3.将取得的元素gain与j位置(排好序列中最大元素)比较,若gain<[j],则将j位置元素后移,再将j往前移动一位再继续比较。
4.直到gain>A[j]或者j<0时,就将gain插入在j+1的位置。
代码演示:
public class InsertionSort {
public static void insert(int []A,int n) {
for(int i=1;i<n;i++) { //默认A[0]已存在排序队列中。
int gain=A[i]; //gain为从未排序数组中取出来的元素。
int j=i-1; //j为已排好序中的最大元素位置
while(j>=0&&gain<A[j]) {
A[j+1]=A[j]; //将j位置的元素后移一位。
j--; //使j往前移动一位。}
A[j+1]=gain; //将取得的元素放在j的后一位。
}
for(int i=0;i<n;i++) {
System.out.println(A[i]);
}
}
public static void main(String[] args) {
int A[]= {1,3,98,54,12,2,63,36};insert(A,8);
}
}
需要思考的几点:
1.为什么我们要将A[i]赋给变量gain呢?不可以直接拿A[i]去进行比较,插入吗?
当j=i-1时,A[i]==A[j+1];A[i]<A[j]时,A[j+1]=A[j]此时A[i]的值会被j位置的值覆盖,到最后插入时会找不到原本取得的 元 素,所以必须用变量gain来保存A[i]的值。
2.while()循环的作用是找到取得的元素应该所在的位置,并将比他大的元素统统后移一位,将该位置空出来。
3.跳出while()循环:
1)当j移动到j<0时(j==-1),说明取得的元素是排好序中元素最小的,所以将该元素放到A[j+1]即A[0]处。
2)或者当gain>A[j]时,此时gain就应处于j+1的位置。