插入排序(直接插入排序:)

记录存放在数组R[0….n-1]中,排序过程的某一中间时刻,R被划分成两个子区间R[0…i-1]和R[i….n-1],其中:前一个子区间是已排好序的有序区;后一个子区间则是当前未排序的部分。

当插入第i(i≥1)个对象时, 前面的r[0], r[1], …, r[i-1]已经排好序。 用r[i]的关键字与r[i-1], r[i-2], …的关键字顺序进行比较(和顺序查找类似),如果小于,则将r[x]向后移动(插入位置后的记录向后顺移);找到插入位置即将r[i]插入。

直接插入排序:

关键字比较次数和记录移动次数与记录关键字的初始排列有关。 最好情况下, 排序前记录已按关键字从小到大有序, 每趟只需与前面有序记录序列的最后一个记录比较1次, 移动2次记录, 总的关键字比较次数为 n-1, 记录移动次数为 2(n-1)。在平均情况下的关键字比较次数和记录移动次数约为n² /4。 直接插入排序是一种稳定的排序方法 直接插入排序最大的优点是简单,在记录数较少时,是比较好的办法。

 ////////////////插入排序//////////////////////
    //插入排序
    public void insertSort(int a[] ){
        //a = new int[]{21,25,49,25,16,8,23,45,-3,4};
        //依次把每个元素拿来插入到之前的有序子序列(从第二个开始,到最后就行)
        for(int i=0;i<a.length-1;i++){//趟数,每趟插入第i+1个元素---待插入的数
            //先把待插入的数备份到temp中
            int temp = a[i+1];
            
            //从i(有序子序列的最后一个位置)往前遍历,找一个位置j,让a[j]不大于temp;同时若a[j]大于temp则让该数往后挪个位置
            int j=i;
            while(a[j]>temp){//若a[j]大于temp则让该数往后挪个位置
                a[j+1]=a[j];
                j--;
                if(j<0){
                    break;
                }
            }
            
            //经过上面的操作,j+1位置就是temp将要放置的
            a[j+1]=temp;
        }
        
        print(a);
    }
    
    public static void main(String[] args) {
        int a[] = {21,25,49,25,16,8,23,45,-3,4};
        new SortMethods().insertSort(a);
    }
    

猜你喜欢

转载自blog.csdn.net/qq_35307947/article/details/81456493