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

来源:互联网 发布:c语言小爱心代码 编辑:程序博客网 时间:2024/06/08 02:11
/* * 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作为距离排过序,使文件较接近于有序状态,所以新的一趟排序过程也较快。

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

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

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

原创粉丝点击