public class ShellSort {
/**
* 希尔排序
* 步长的确定该是一个问题,影响最终效率。
* Shell 排序 第一个突破时间复杂度为O2的算法, 非稳定排序算法
* 算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,
* 每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,
* 在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成
* @param args
*/
public static void shellSort(int[] arr) {
if(arr==null||arr.length==0) {
return ;
}
int temp = 0;
int step = arr.length;//步长
while(true) {
step = step/2;
for(int i=0;i<step;i++) {//前半部分
for(int j = i+step;j<arr.length;j+=step) {//后半部分
int k = j;//记录下当前的 j 的位置
temp = arr[j];//当前位置的值
for(k-=step;k>=0&&arr[k]>temp;k-=step) {//前半部分, 如果前面的值大于后面的值,则交换
arr[k+step] = arr[k];//把较大值放后头
}
//上一个循环结束时,k会减去一个步长,因此,这里要加回一个步长才能得到前半部分的索引值index
arr[k+step] = temp;//较小值放前面
}
}
if(step == 1) {
break;
}
}
}
public static void main(String[] args) {
int[] arr={49,38,65,1,97,76,13,27,42,78,34,12,64,1};
shellSort(arr);
for (int i : arr) {
System.out.println(i);
}
}
}
排序算法-------希尔排序(ShellSort)
猜你喜欢
转载自blog.csdn.net/weixin_42061676/article/details/81093106
今日推荐
周排行