log(2n)
2.分析:
简答插入排序时,当插入的数很小时,需要移动很多次,影响效率。比如如图最后的0.
注意:
**希尔排序也是插入排序。**改进版
利用步长
2.两种方式:
- 交换法
- 移位法
代码:
//交换法:
public void shellSort(int []arr) {
int temp=0;
for(int gap=arr.length/2;gap>0;gap/=2){
for(int i=gap;i<arr.length;i++){
//遍历各组中的所有元素,步长gap
for(int j=i-gap;j>=0;j-=gap){
//j=j-gap 可理解为退出循环的条件
//如果当前元素大于加上步长后的那个元素,交换
if(arr[j]>arr[j+gap]){
temp=arr[j];
arr[j]=arr[j+gap]; //在这里时,发现一个交换一个,可见效率也不会很高????
arr[j+gap]=temp;
}
}
}
}
System.out.println(Arrays.toString(arr));
}
这里采用交换式排序后,同样的80000个数据,我们测试完发现变得更慢了,而问题就在这个交换过程。
改进版:保留原来插入排序的移位式
package com;
import java.lang.reflect.Array;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class choose {
public static void main(String[] args) {
int []arr=new int[8000000];
for(int i=0;i<arr.length;i++){
arr[i]=(int)(Math.random()*8000000);
}
// int [] arr={1,4,5,3,9,0,8};
choose c=new choose();
Date date=new Date();
SimpleDateFormat sim=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = sim.format(date);
System.out.println(s);
c.shellSort(arr);
Date date1=new Date();
SimpleDateFormat sim2=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s1 = sim2.format(date1);
System.out.println(s1);
}
public void shellSort(int []arr) {
for(int gap=arr.length/2;gap>0;gap/=2){
for(int i=gap;i<arr.length;i++){
//遍历各组中的所有元素,步长gap
int j=i;
int temp=arr[j];
if(arr[j]<arr[j-gap]){
while(j-gap>=0&&temp<arr[j-gap]){
//移动
arr[j]=arr[j-gap];
j-=gap;
}
//退出while,说明找到了
arr[j]=temp;
}
}
}
//System.out.println(Arrays.toString(arr));
}
}