java 插入排序

在习得 java算法 一书后,回顾了 一些排序算法,便将其 记录下来。以便复习使用。

插入排序对于实际应用中常见的某些类型的非随机的数组是很有效的,尤其是有序的数组,当你用插入排序对一个有序数组进行排序的时候,插入排序可以立即发现每个元素都是在合适的位置上,他的时间是线性的,而对于这种数组,选择排序的运行时间是平方级别的(为了排序每个数组而遍历一遍数组)。

使用插入排序合适的情况:

1.一个有序的大数组接一个较小的数组。
2.数组中只有几个元素的位置不正确。
3.数组中的每个元素离它的最终位置都不远(ps:可以理解为部分有序的)。

思路:

  1. temp用于保存被比较的数值
  2. 前一位数值移动到被比较的数值的位置
  3. 前面排好序的继续往后移动
  4. 把被比较的数值放到适当的位置
    这里写图片描述
    下面是自己的代码:

package 插入_排序;
public class 插入排序 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int a[] = {3,2,1};
        sort_1(a);
        for(int i:a){
            System.out.print(i);
        }
    }
    public static int [] sort_1(int []a){
        for(int i=1;i<a.length;i++){//待排序的位置
            int temp=a[i];//待排序的数字
            int j;
            for( j=i-1;j>=0;j--){
                if(a[j] > temp){//前一位数值移动到被比较数值的位置
                    a[j+1] = a[j];//前面 都是 顺序的,将他们往后移即可
                }
            }
            a[j+1] = temp;  //将待排序位置 插入到合适的位置
        }
        return a;
    }
}

为了使得 使用起来更加的方便,而不是 每次都是在循环里进行比较,交换等重复操作,便用函数将其封装起来。

package 插入_排序;
/* *能排序的数据类型 都实现了Comparable 接口,避免只是为单一数据类型 * */
public class 插入排序_2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Comparable[]a  = {2,1,5,3,4,6,9,7,8,7,0,7,1};
        sort(a);
        show(a);
    }
    //传入的为Comparable 每个数值类型都实现了该接口
    public static void sort(Comparable []a){
        //按升序排列
        int n =  a.length;
        for( int i =0;i<n;i++){
            for(int j=i;j>0 && less(a[j], a[j-1]);j--){
                exch(a, j, j-1);
            }
        }
    }
    //对元素进行比较的函数
    public static boolean less(Comparable a,Comparable b){
        //这里返回为true的条件是 a<b a>b 返回false
        return a.compareTo(b) <0;
    }
    //用于交换的函数
    public static void exch(Comparable []a,int i,int j){
        Comparable  t = a[i];
        a[i] = a[j];
        a[j] = t;
    }
    //打印 数组的函数
    public static void show(Comparable[] a){
        //在单行中打印数组
        for(int i=0;i<a.length;i++){
            System.out.print(a[i]);
        }
        System.out.println("");
    }
    //用于判断数组元素是否有序 排序后 进行判断还是有必要的
    public static boolean isSortde(Comparable[] a){
        //循环比较数组
        for(int i=1; i<a.length;i++)
            if(less(a[i], a[i-1]))
                return false;
        return true;
    }
}

你可能感兴趣的:(插入排序)