• 简单排序算法——插入排序


    插入排序:

    之前在学习插入排序时,在网上看到了一个直观的图解:

    基本原理解释:

    利用插入法对无序数组排序时,我们其实是将数组R划分成两个子区间R[1..i-1](已排好序的有序区)和R[i..n](当前未排序的部分,可称无序区)。

    插入排序的基本操作是将当前无序区的第1个记录R[i]插人到有序区R[1..i-1]中适当的位置上,使R[1..i]变为新的有序区。因为这种方法每次使有序区

    增加1个记录,通常称增量法。

    稳定 
    空间复杂度O(1) 
    时间复杂度O(n2
    最差情况:反序,需要移动n*(n-1)/2个元素 
    最好情况:正序,不需要移动元素

    数组在已排序或者是“近似排序”时,插入排序效率的最好情况运行时间为O(n);

    插入排序最坏情况运行时间和平均情况运行时间都为O(n2)。

    根据自己的理解写了两个代码:

    执行代码:

    (1)

    package sdx;
    import java.util.Arrays;
    public class Main8c {
    public static void Main(int a[]){
    int i,j,t,index;
    for(i=1;i<a.length;i++){
    index=a[i];
    for(j=i-1;j>=0&&a[j]>index;j--){
    a[j+1]=a[j];
    a[j]=index;
    }
    }
    }

    public static void main(String[] args) {
    Main8c ss=new Main8c();
    int a[]={2,4,6,78,4,3,54,7,78,2,234234,6534,6,7,568,9,7354,635,8,56,};
    ss.Main(a);
    System.out.print(Arrays.toString(a)+" ");

    }

    }

    理解:

    1.写了一个静态方法,有一个数组作为参数

    2.定义四个参数,其中index作为索引,

    3.数组从a[1]开始,将a[0]设为左边的有序数组,所以i从1开始,此时默认左边的数组已经有序。

    4.将右边数组的值赋值给index,用index去和左边的数组去比较。

    5.因为i=数组下标1,所以,j的值是i左边的一位,所以j=i-1,但是j要在数组的长度之内,不能取左边小于0,所以j的下标要j>=0。
    如果j的值比索引的值大,就将这个值向右移,然后将索引值重新赋值给a[j].这样就实现了数组的右移,将新的数据添加到左边的数组中去。

    6.开始循环执行。。。。

    7.测试类传值。

    (2)

    public void doInsertSort(){
    for(int index = 1; index<length; index++){//外层向右的index,即作为比较对象的数据的index
    int temp = array[index];//用作比较的数据
    int leftindex = index-1;
    while(leftindex>=0 && array[leftindex]>temp){//当比到最左边或者遇到比temp小的数据时,结束循环
    array[leftindex+1] = array[leftindex];
    leftindex--;
    }
    array[leftindex+1] = temp;//把temp放到空位上
    }
    }

    public static void main(String[] args){
    int[] array = {38,65,97,76,13,27,49};
    InsertSort is = new InsertSort(array);
    System.out.println("排序前的数据为:");
    is.display();
    is.doInsertSort();
    System.out.println("排序后的数据为:");
    is.display();
    }
    }

  • 相关阅读:
    (笔试题)关于C++的虚函数和多态性
    (笔试题)只用逻辑运算实现乘法运算
    (笔试题)只用逻辑运算实现加法运算
    (C++)浅谈多态基类析构函数声明为虚函数
    (C++)C++多态性中的静态绑定和动态绑定
    (C++)C++类继承中的构造函数和析构函数
    (C++)浅谈using namespace std
    (笔试题)不用除法操作符,实现两个整数的除法
    (笔试题)不用除法操作符,实现两个正整数的除法
    当你学会专注,人生才算真正成熟
  • 原文地址:https://www.cnblogs.com/sdx-BK/p/12012960.html
Copyright © 2020-2023  润新知