/**
* instruction of project
*
* @author Aruiea.com
* @ClassName ShellSort
* @Version 1.0
* @Date 2020/7/31 9:29
* 希尔排序是在插入排序上的拓展:主要解决
* 思路如下:
* 在要排序的一组数中,根据某一增量分为若干子序列,并对子序列分别进行插入排序。
* 然后逐渐将增量减小,并重复上述过程。直至增量为1,此时数据序列基本有序,最后进行插入排序。
* 比如:length=13,假设间隔取k=5.则数据序列下标是:{0,5,10},{1,6,11},{2,7,12},{3,8}{4,9}一共k个序列,再对他们进行插入排序。
* 然后把间隔k减少。
* 直到间隔为1。
*/
public class ShellSort {
public static void main(String[] args) {
int[] arr ={10,9,8,7,6,5,4,3,2,1};
shell_sort( arr,arr.length);
for (int i : arr) {
System.out.printf(" "+i);
}
}
public static void shell_sort(int array[],int lenth){
//希尔排序
int gap = array.length;
while (true) {
gap /= 2; //增量每次减半
for (int i = 0; i < gap; i++) {//每一个序列的起始元素从0到间隔-1,代表共有多少组序列
for (int j = i + gap; j < array.length; j += gap) {//这个循环里其实就是一个插入排序
//第一个元素默认有序,所以j从第二个元素i+gap开始。
int temp = array[j];
int k = j - gap;//由于j=i+gap,j=j-gap最多为0,用其他可能出现数组下标越界。
while (k >= 0 && array[k] > temp) {
array[k + gap] = array[k];
k -= gap;
}
array[k + gap] = temp;
}
}
if (gap == 1)
break;
}
}
}
数据结构note8:希尔排序
最新推荐文章于 2024-05-28 21:47:08 发布