public static void inset_order(int[] disorder){
for (int i = 1; i < disorder.length; i++) {
if(disorder[i-1]>disorder[i]){
//将待插入元素提取出来,以便与前边元素进行比较。最后用来插入使用
int temp=disorder[i];
disorder[i]=disorder[i-1];
int j=i-2;
//循环比较索引(i-1)前边元素与待插入元素,如果元素大则前移
while(j>-1&&disorder[j]>temp){
disorder[j+1]=disorder[j];
j--;
}
//最后将插入元素插入
disorder[j+1]=temp;
}
}
以上是我的插入排序算法我们要介绍的希尔排序是在插入排序基础上的改进算法!
再次基础上的希尔排序:
public static void shellInsertSort(int[] disorder,int d){
//循环比较一定间隔的元素,插入排序的间隔是1,因此每个元素都会遍历到,就可以排序了
//在此0 d 2d 3d 4d;1 1+d 1+2d 1+3d 1+4d;...都是排好序的
for (int i = d; i < disorder.length; i++) {
if(disorder[i-d]>disorder[i]){
//将待插入元素提取出来,以便与前边元素进行比较。最后用来插入使用
int temp=disorder[i];
disorder[i]=disorder[i-d];
int j=i-d;
//循环比较索引(i-d)前边元素与待插入元素,如果元素大则交换
while(j>-1&&disorder[j]>temp){
disorder[j+d]=disorder[j];
j-=d;
}
//最后将插入元素插入
disorder[j+d]=temp;
}
}
}
public static void shellSort(int[] disorder,int n){
int d=n/2;
while(true){
shellInsertSort(disorder, d);
if(d==1){
break;
}
d=d/2;
}
}
测试:
public static void main(String[] args) {
int[] disorder={56,45,28,34,87,33,2,43,66,234,46,54,34,23,8,23,666,78};
shellSort(disorder,18);
printArray(0, disorder);
}
public static void printArray(int d,int[] disorder){
//if(d!=0)
System.out.print("当间隔d="+d+"时: ");
for (int i = 0; i < disorder.length; i++) {
System.out.print(disorder[i]+" ");
}
System.out.println();
}
当间隔d=9时: 56 45 28 34 23 8 2 43 66 234 46 54 34 87 33 23 666 78
当间隔d=4时: 23 8 2 23 34 45 28 34 56 78 33 43 66 87 46 54 666 234
当间隔d=2时: 2 8 23 23 28 34 33 43 34 45 46 54 56 78 66 87 666 234
当间隔d=1时: 2 8 23 23 28 33 34 34 43 45 46 54 56 66 78 87 234 666
当间隔d=0时: 2 8 23 23 28 33 34 34 43 45 46 54 56 66 78 87 234 666