希尔排序:
希尔排序是一个不稳定的排序方法,当n在某个特定范围时,希尔排序的时间复杂度约为O(n^1.3),在最坏情况下希尔排序的时间复杂度为O(n^2)。
基本思想:先将待排序表分割成若干个形子序(按照规定的增量步长),分别进行直接插入排序,当整个表中元素已基本有序的情况下,再对全体元素进行一次直接插入排序。
例如:待排序序列为[6,5,4,3,2,1],增量序列为{3,1},则先分为两个序列[6,5,4]和[3,2,1],两个序列对应下标元素分别比较:如6和3比较,3<6,则交换位置,如此类推,比较完,最后进行步长为1的比较,即对所有元素进行一次直接插入排序。
下面实现的是从小到大排序:
第一种:每次增量为原先的一半,初始为元素个数的一半
package InsertSort;
import java.util.Scanner;
public class ShellSort {
public static void shellSort(int num[]){
int j = 0;
int temp = 0;
for(int increment=num.length/2;increment>0;increment/=2){
for(int i=increment;i<num.length;i++){
temp = num[i];
for(j=i;j>=increment;j-=increment){
if(temp<num[j-increment]){
num[j] = num[j-increment];
}
else{
break;
}
}
num[j] = temp;
}
}
for(int k=0;k<num.length;k++){
System.out.print(num[k]+" ");
}
System.out.println();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("请输入需排序序列:");
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
String arr[] = str.split(" ");
int num[] = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
num[i] = Integer.parseInt(arr[i]);
}
shellSort(num);
}
}
第二种:增量分别为5,3,1
package InsertSort;
import java.util.Scanner;
public class shellsort1 {
public static void shellSort(int num[]){
for(int d=5;d>0;d=d-2){
for(int c=0;c<num.length-d;c++){
for(int i=c;i<num.length;i=i+d){
for(int j=i;j>0;j=j-d){
if(j<d)
break;
if(num[j]<num[j-d]){
int tmp;
tmp=num[j];
num[j]=num[j-d];
num[j-d]=tmp;
}
}
}
}
}
for(int k=0;k<num.length;k++){
System.out.print(num[k]+" ");
}
System.out.println();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("请输入需排序序列:");
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
String arr[] = str.split(" ");
int num[] = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
num[i] = Integer.parseInt(arr[i]);
}
shellSort(num);
}
}