插入排序算法之直接排序和希尔排序,java简单实现

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Sorting;

import java.util.Scanner;

/**
 *
 * @author Biaoming
 */
public class InsertSort {
    public static void main(String [] args){
        InsertSort mysort = new InsertSort();
        Scanner myscan = new Scanner(System.in);
        int listLength = myscan.nextInt();//获取输入数组长度
        int [] unSortedlist = new int[listLength];
        for(int i = 0 ;i<listLength;i++){
            unSortedlist[i] = myscan.nextInt();//获取输入数组元素
        }
        mysort.StraightInsert(unSortedlist);//直接插入排序
        //mysort.ShellInsert(unSortedlist);//希尔排序
        for(int i = 0 ;i<listLength;i++){
            System.out.print(unSortedlist[i]+" ");//输出排序后数组元素
        }
    }
    public void StraightInsert(int[] list) {
        int i, j, tmpInt;
        for (i = 1; i < list.length; i++) {
            tmpInt = list[i];
            for (j = i; j > 0 && tmpInt < list[j-1]; j--) {
                list[j] = list[j-1];
            }
            list[j] = tmpInt;
        }
    }
    private void ShellIterator(int[] list, int increment) {
        int i,j,tmpInt;
        for (i = increment; i < list.length; i++) {
            tmpInt = list[i];
            for (j = i; j>0 && tmpInt < list[j - increment]; j -= increment) {
                list[j] = list[j - increment];
            }
            list[j] = tmpInt;
        }
    }
    public void ShellInsert(int[] list) {
        int increment = list.length;
        while (increment > 0) {
            increment = increment / 2;
            ShellIterator(list, increment);
        }
    }
}
Shell排序的时间性能优于直接插入排序
     希尔排序的时间性能优于直接插入排序的原因:
  ①当文件初态基本有序时直接插入排序所需的比较和移动次数均较少。
  ②当n值较小时,n和n2的差别也较小,即直接插入排序的最好时间复杂度O(n)和最坏时间复杂度0(n2)差别不大。
  ③在希尔排序开始时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量di逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但由于已经按di-1作为距离排过序,使文件较接近于有序状态,所以新的一趟排序过程也较快。

     因此,希尔排序在效率上较直接插人排序有较大的改进。

稳定性而言,希尔排序是不稳定的,而直接插入排序是稳定的。

排序算法稳定性:在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的;若具有相同关键字的记录之间的相对次序发生变化,则称这种排序方法是不稳定的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值