思想:
希尔排序是插入排序的改进,
将一组数字按照特定规则分成若干组,在每组中进行插入排序;
将排完序后的数字重新进行分组,再进行插入排序;
分的组数由大到小,直到最后将所有数字分成一组。
- 分组规则:gap表分得的组数
gap = array.length
gap = (gap/3)+1
具体实现:
- 先分组,每组进行插入排序
分的组数 = gap=array.length
gap = (gap/3)+1 - 重新进行分组,每组进行插入排序
gap = (gap/3)+1
…
分的组数越来越小
直到所分的组数为1,就不再分组
实例理解:
给定一组数字:9,2,5,7,3,8,3,6,1
相同颜色代表一组数字
代码实现1:
package www.fanfan.com;
import java.util.Arrays;
/**
* author:kelly_fanfan
*/
public class Code_希尔排序 {
public static void main(String[] args) {
int[] array = {9,2,5,7,3,8,3,6,1};
shellSort(array);
System.out.println(Arrays.toString(array));
}
public static void shellSort(int[] array){
int gap = array.length;
while(true){
//分组
gap = (gap/3)+1;
//插入排序
insertSort(array,gap);
//如果只能分一组时,排完序后直接退出
if (gap == 1){
break;
}
}
}
public static void insertSort(int[] array,int gap){
for (int i = 0; i < array.length;i++){
int key = array[i];
int j = i-gap;
for (;j >= 0 && key < array[j]; j = j-gap){
array[j+gap] = array[j];
}
array[j+gap] = key;
}
}
}
代码实现2:
package www;
import java.util.Arrays;
public class ShellSortTest {
public static void main(String[] args) {
int[] array = {9,2,5,7,3,8,3,6,1};
shellSort(array);
System.out.println(Arrays.toString(array));
}
public static void shellSort(int[] array){
int gap = array.length;
int i,j;
while (gap != 1){
gap = gap/3+1;
for (i = 0;i < array.length;i=i+gap){
int temp = array[i];
for (j = i-gap;j >= 0;j=j-gap){
if (temp < array[j]){
array[j+gap] = array[j];
}else {
break;
}
}
array[j+gap] = temp;
}
}
}
}