希尔排序:
介绍:
希尔排序(Shell's Sort)是
插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,
算法便终止。
如何理解?
先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量
百度图解:
个人理解: 该排序增量 在初始是为 5 五组
第二趟为 3 三组
三趟:1 组
package com.temp;
/**
* 希尔排序
* @author Mr.L
*{@value} 1.0
*/
public class D {
/**
*
* @param array 数组
* @param lenth 长度
*/
public static void shell_sort(int array[],int lenth){
int temp = 0;
int incre = lenth;
while(true){
incre = incre/2;
for(int k = 0;k<incre;k++){ //根据增量分为若干子序列
for(int i=k+incre;i<lenth;i+=incre){
for(int j=i;j>k;j-=incre){
if(array[j]<array[j-incre]){
temp = array[j-incre];
array[j-incre] = array[j];
array[j] = temp;
}else{
// 退出
break;
}
}
}
}
// 最后一个增量必须为1
if(incre == 1){
break;
}
}
//输出
for (int k = 0; k <array.length; k++) {
System.out.println(array[k]);
}
}
public static void main(String[] args) {
// 定义数组 赋值
int [] array= {1,6,2,50,10};
// 调用
shell_sort(array, 5);
}
}
输出: