/*
* 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作为距离排过序,使文件较接近于有序状态,所以新的一趟排序过程也较快。
因此,希尔排序在效率上较直接插人排序有较大的改进。
稳定性而言,希尔排序是不稳定的,而直接插入排序是稳定的。
排序算法稳定性:在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的;若具有相同关键字的记录之间的相对次序发生变化,则称这种排序方法是不稳定的。