插入排序-java代码演示

插入排序作为一种经典的排序算法,我们也是必须要掌握的。

基本思想:将未排好序的数组中将元素挨个取出来,将其与排好序的元素中,从后往前比较,若比其大就将该元素后移一位,将取得的元素插入。

原理:

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的位置。


猜你喜欢

转载自blog.csdn.net/Z_zfer/article/details/80167717