思路:
- 1.选择一个增量序列t1,t2,…,tk,其中t1>t2,tk=1;
- 2.按增量序列个数k,对序列进行k 趟排序;
- 3.每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
代码实现:
public static void shellSort(int[] arr){
//初始化一个增量:(当希尔排序的增量变为1的时候即插入排序)
int increment = arr.length / 3 + 1;
while(increment > 0){
for(int i = increment;i < arr.length ;i++){
//i处的元素比i-increment处的元素小
if(arr[i] < arr[i - increment]){
int j = 0;
int tmp = arr[i];//将i的元素保存起来,以便i-increment的后移操作
for(j = i - increment;j >= 0;j -= increment){//遍历,找到tmp插入的位置
if(arr[j] > tmp){
//只要比tmp大,都将其后移
arr[j + increment] = arr[j];
}else {
break;
}
}
arr[j + increment] = tmp;//将tmp插入相应的位置
}
}
increment--;
}
}
复杂度分析: