插入排序的基本思想每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,找出插入位置,将该元素插入到有序数列的合适位置中,主要包括直接插入排序与希尔排序。
package sortAlgorithms;
/*
* @author x@j
* @date 2013-10-01
* @content InsertSort
* 插入排序(Insert Sort)的基本思想是:
* 每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,
* 直到全部记录插入完成为止。
*
*/
public class InsertSort<E extends Comparable<E>> extends Sort<E> {
@Override
public void sort(E[] array, int p, int q) {
System.out.print("insert sort初始序列为");
printArray(array);
//int count1=1;
for(int i=p+1;i<=q;i++){
E key=array[i];
int j=i-1;
while(j>-1&&key.compareTo(array[j])<0){
//System.out.print("比较次数 ="+(count1++));
array[j+1]=array[j];
j--;
}
array[j+1]=key;
System.out.print("第 "+i+ "趟排序结果为");
printArray(array);
}
}
public static void main(String[] args) {
InsertSort<Integer> is=new InsertSort<Integer>();
Integer[] a={49,38,65,97,76,13,27,49};
is.sort(a);
}
}
/*
* 初始序列为 49 38 65 97 76 13 27 49
第 1趟排序结果为 38 49 65 97 76 13 27 49
第 2趟排序结果为 38 49 65 97 76 13 27 49
第 3趟排序结果为 38 49 65 97 76 13 27 49
第 4趟排序结果为 38 49 65 76 97 13 27 49
第 5趟排序结果为 13 38 49 65 76 97 27 49
第 6趟排序结果为 13 27 38 49 65 76 97 49
第 7趟排序结果为 13 27 38 49 49 65 76 97
*/
package sortAlgorithms;
/*
* @author x@j
* @date 2013-10-01
* @content ShellSort
* 相比直接插入排序,选择的增量变化,以减少交换位置的次数
* */
public class ShellSort<E extends Comparable<E>> extends Sort<E> {
public static void main(String[] args) {
ShellSort<Integer> is=new ShellSort<Integer>();
Integer[] a={49,38,65,97,76,13,27,49};
is.sort(a);
}
@Override
public void sort(E[] a, int p, int q) {
System.out.print("shell sort初始序列为");
printArray(a);
double d1=q-p+1;
E temp;
//int count=1;
//int count1=1;
while(true){
d1= Math.ceil(d1/2);//向上取整数
int d=(int) d1;
for(int x=p;x<d;x++){
for(int i=x+d;i<=q;i+=d){
int j=i-d;
temp=a[i];
while(j>=0&&temp.compareTo(a[j])<0){
//System.out.print("比较次数 ="+(count1++));
a[j+d]=a[j];//插入排序
j-=d;
}
a[j+d]=temp;
}
//System.out.print("迭代次数 ="+(count++));
}
System.out.print("增量 d="+d+ " 排序结果为");
printArray(a);
if(d==1){
break;
}
}
}
}
/*
shell sort初始序列为 49 38 65 97 76 13 27 49
增量 d=4 排序结果为 49 13 27 49 76 38 65 97
增量 d=2 排序结果为 27 13 49 38 65 49 76 97
增量 d=1 排序结果为 13 27 38 49 49 65 76 97(同插入排序)
*/