插入排序

1:基本思想

插入排序属于内部排序,将欲排序的元素以插入的方式来寻找该元素的适当位置,以达到排序的目的。

排序思想介绍:将n个待排序的元素,看成一个有序表和无序表的形式,最开始阶段有序表阶段只包含一个元素,无序表包含n-1个元素,排序过程每次从无序表中取出第一个元素,把他排序码依次与有序元素排序码进行比较,插在它的适当位置,使之成为新的有序表即可。

 

2:代码示例

package sort;

import java.util.Arrays;

public class InsertSortTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] a= new int[] {
            5,3,2,4,1,4,6,2,34,252,52,52,5
        };
        
        InsertSort is = new InsertSort(a);
        is.startSort();
        is.show();
    }

}

//插入排序:将n个特定的序列,分为有序表和无序表,开始时有序表只有1个元素,无序表有n-1个元素。在无序表中拿出第一个元素,与有序表中元素比较,放在有序表中合适位置,此时有序表为2.,无序表为n-2,依次类推
class InsertSort{
    //时间复杂度为O(n^2)
    private int temp ;//定义变量temp,用来交换中的缓存数据
    private boolean flag;//是否进行过交换的标志?false代表没有交换过,true则代表交换过
    private int[] array;//待排序的数组
    private int length;//待排序的数组长度
        
        
    public InsertSort(int[] a) {
        this.array = a;
        this.temp = 0;
        this.flag = false;
        this.length = array.length;
    }    
    
    public void startSort() {
        //从特殊到一般的方法来实现插入排序
        
        //第一轮{5,3,2,4,1} => {3,5,2,4,1}
        int indexValue = array[1];
        int index = 0;//带排序数据的前一个地址
        
//        //从index+1的位置向前判断,插入位置。
//        while(index>=0 && indexValue<array[index]) {//待排序的值只要小于前面的数据,且没有出界,则进行后移即可
//            array[index+1] = array[index];//{5,5,2,4,1}
//            index--;
//        }
//        array[index+1] = indexValue;//在后移结束后,将待排序数据放在后移序列的指定位置即可!
//        
//        
//        //第二轮{3,5,2,4,1} => {2,3,5,4,1}
//        indexValue = array[2];
//        index = 1;//带排序数据的前一个地址
//        
//        //从index+1的位置向前判断,插入位置。
//        while(index>=0 && indexValue<array[index]) {
//            array[index+1] = array[index];//{5,5,2,4,1}前面数据向后移动
//            index--;
//        }
//        array[index+1] = indexValue;
//        
//        
//        //第三轮{3,5,2,4,1} => {2,3,4,5,1}
//        indexValue = array[3];
//        index = 2;//带排序数据的前一个地址
//        
//        //从index+1的位置向前判断,插入位置。
//        while(index>=0 && indexValue<array[index]) {//
//            array[index+1] = array[index];//{5,5,2,4,1}前面数据向后移动
//            index--;
//        }
//        array[index+1] = indexValue;
//        
//        //第四轮{2,3,4,5,1} => {1,2,3,5,4}
//        indexValue = array[4];
//        index = 3;//带排序数据的前一个地址
//        
//        //从index+1的位置向前判断,插入位置。
//        while(index>=0 && indexValue<array[index]) {
//            array[index+1] = array[index];//{5,5,2,4,1}前面数据向后移动
//            index--;
//        }
//        array[index+1] = indexValue;
        
        for(int i=1;i<array.length;i++) {
            indexValue = array[i];
            index = i-1;//带排序数据的前一个地址
            
            //从index+1的位置向前判断,插入位置。
            while(index>=0 && indexValue<array[index]) {
                array[index+1] = array[index];//{5,5,2,4,1}前面数据向后移动
                index--;
            }
            array[index+1] = indexValue;
        }
        
    }
    
    
    public void show() {
        System.out.println(Arrays.toString(array));
    }
    
}

我们采用特殊到一般的思想来假设第一轮的时候,进行array[1]数据和array[0]数据的插入排序,若小于array[0]则将array[1] = array[0],然后将前面保存的array[1]值赋给array[0]。

第二轮用array[2]的数据和array[1]的数据比较,若小于array[1],则将array[2]= array[1],然后再进行比较array[0],如果小于array[0]则重复上面操作,如果array[2]大于array[0],则退出循环,将array[1] = 原本缓存的array[2]即可。

通过特殊到一般的方法,找到循环的技巧,然后使用for循环内嵌while的方式来完成插入排序的操作。

posted @ 2020-02-24 20:18  大朱123  阅读(144)  评论(0)    收藏  举报