1、希尔排序思想及概述
希尔排序是插入排序的一种,如果有读者对插入排序不太熟悉可以参考以下我写的一篇关于插入排序的的博文点击打开链接。
希尔排序是插入排序的一种,但是也在插入排序的基础上做了很多相关的改进,希尔排序最大的特点就是缩小增量。直接插入排序当待排序的记录个数较少且待排序序列的关键字基本有序时,效率较高。希尔排序则是基于以上两点,从减少记录个数和序列基本有序两个方面对直接插入排序进行了改进。
2、算法步骤
- 第一趟取增量N,所有间隔为N的记录分在同一组,在各个组中进行直接插入排序
- 第二次增量取N2,N2<N(在我的算法实现中,每次我都将增量缩小一半)
- 重复以上步骤直到N为1时,所有的记录在同一组中进行排序为止
3、代码分析
public static void ShellSort(int[] arr) {
//增量N,N初始值为数组的长度
int N=arr.length;
//N每次以倍数缩小
for(;N>=1;N=N/2)
//以指定的增量N进行希尔排序
ShellInsert(arr,N);
}
public static void ShellInsert(int[] arr,int dk) {
int N=dk;
//指定增量(步长)
for(int i=0;i<N;i++) {
//以下为插入排序的思想实现
for(int j=i+N;j<arr.length;j+=N) {
int tmp=arr[j];
int k;
for(k=j-N;k>=0;k-=N) {
if(arr[k]>tmp) {
arr[k+N]=arr[k];
}
else
break;
}
arr[k+N]=tmp;
}
}
}
4、附完整代码展示
ShellSort.java文件
package com.jz.sort;
public class ShellSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr=new int[] {49,38,65,97,76,13,27,49,55,4};
ShellSort(arr);
Show(arr);
}
public static void ShellSort(int[] arr) {
//增量N,N初始值为数组的长度
int N=arr.length;
//N每次以倍数缩小
for(;N>=1;N=N/2)
//以指定的增量N进行希尔排序
ShellInsert(arr,N);
}
public static void ShellInsert(int[] arr,int dk) {
int N=dk;
//指定增量(步长)
for(int i=0;i<N;i++) {
//以下为插入排序的思想实现
for(int j=i+N;j<arr.length;j+=N) {
int tmp=arr[j];
int k;
for(k=j-N;k>=0;k-=N) {
if(arr[k]>tmp) {
arr[k+N]=arr[k];
}
else
break;
}
arr[k+N]=tmp;
}
}
}
//直接插入排序方法
public static void InsertSort(int[] arr) {
for(int i=1;i<arr.length;i++) {
int tmp=arr[i];
int j;
for(j=i-1;j>=0;j--) {
if(tmp<arr[j]) {
arr[j+1]=arr[j];
}
else
break;
}
arr[j+1]=tmp;
}
}
public static void Show(int[] arr) {
for(int i=0;i<arr.length;i++) {
System.out.print(arr[i]+"\t");
}
System.out.println();
}
}
附:以上内容皆为作者原创,转载请注明出处