三、希尔排序
在要排序的一组数中,根据某一增量分为若干子序列,并对子序列分别进行插入排序。
然后逐渐将增量减小,并重复上述过程。直至增量为1,此时数据序列基本有序,最后进行插入排序。
希尔排序增量的选取非常关键,增量每次除以3递减可以达到O(n^(3/2))的时间复杂度
import java.util.Scanner;
public class Test{
//定义数组的最大长度
static final int num=100;
//希尔排序(升序)
public static void XiErSort(int[] arr,int length){
int increment=length;
do{
//增量序列
increment=increment/3+1;
for(int i=increment+1;i<=length;i++){
if(arr[i]<arr[i-increment]){
//将arr[i]插入到有序增量子表
arr[0]=arr[i];
int j=0;
for(j=i-increment;j>0&&arr[0]<arr[j];j-=increment){
arr[j+increment]=arr[j];
}
arr[j+increment]=arr[0];
}
}
}while(increment>1);
}
public static void main(String[] args) {
int[] arr=new int[num];
Scanner in=new Scanner(System.in);
System.out.println("请输入数组中的元素个数(<=100):");
int length=in.nextInt();
System.out.println("输入数组中的元素:");
for(int i=1;i<=length;i++){
arr[i]=in.nextInt();
}
//调用排序方法对数组进行排序
XiErSort(arr, length);
System.out.println("排序后的数组:");
for(int i=1;i<=length;i++){
System.out.print(arr[i]+" ");
}
}
}
运行结果:
请输入数组中的元素个数(<=100):
10
输入数组中的元素:
23 34 56 76 33 11 22 33 55 77
排序后的数组:
11 22 23 33 33 34 55 56 76 77
时间复杂度:O(n^(3/2))
稳定性:不稳定