package datastucture;
public class Sort {
/**
* 直接插入排序:是一种最简单的排序方法,它的基本操作是将一个记录插入到已排好序的
* 有序表中,从而得到一个新的,已排好序的列表。他是一种稳定的排序方式,时间复杂度
* 为O(n^2)。
* @param array
* @param n
* @return
*/
public static int [] InsertSort(int [] array,int n){
for(int i=0;i<n;i++){
System.out.print(" "+array[i]);
}
System.out.println();
for(int i=1;i<n;i++){
int tmp=array[i];
int j;
boolean swap=false;
for(j=i-1;j>=0&&array[j]>tmp;j--){
array[j+1]=array[j];
swap=true;
}
// System.out.println("j="+j);
if(swap){
array[j+1]=tmp;
}
}
for(int i=0;i<n;i++){
System.out.print(" "+array[i]);
}
System.out.println("\n+++++++++++++++++++++InsertSort++++++++++++++");
return array;
}
/**
* 希尔排序:又称“缩小增量排序”,他是使用插入排序方法。
* 基本思想:将整个待排序记录序列分割成若干个子序列分别进行直接插入排序,戴整个序列中的记录
* “基本有序”时,再对全部记录进行一次直接插入排序。
* 算法根据对基本有序序列调用直接插入排序,进行交换的次数相对较少这一特点进行设计。
* 该算法为不稳定排序算法,时间复杂度为O(nlg(n))。
* @param array
* @param n
* @param dk
* @return
*/
public static int [] ShellSort(int [] array,int n,int [] dk){
for(int i=0;i<n;i++){
System.out.print(" "+array[i]);
}
System.out.println();
for(int step=0;step<dk.length;step++){
int d=dk[step];
for(int i=d;i<n;i++){
int j;
int tmp=array[i];
boolean swap=false;
for(j=i-d;j>=0&&tmp<array[j];j=j-d){
array[j+d]=array[j];
swap=true;
}
if(swap){
array[j+d]=tmp;
}
}
System.out.println("\nd="+d);
for(int i=0;i<n;i++){
System.out.print(" "+array[i]);
}
}
System.out.println("\n++++++++++++++++finished++++++++++++++++");
for(int i=0;i<n;i++){
System.out.print(" "+array[i]);
}
System.out.println("\n+++++++++++++ShellSort++++++++++++++++");
return array;
}
public static void main(String [] args){
int [] array={12,4,2,5,9,4,3,10,11,3};
Sort.InsertSort(array, 10);
int [] array2={12,4,2,5,9,4,3,10,11,3};
int [] dk={5,3,1};
Sort.ShellSort(array2, 10, dk);
}
}