希尔排序算是对简单插入排序的一种改进,属于一种增量式的排序算法。
还不明白希尔排序概念的,先看这个希尔排序介绍
直接放代码
package com.lingaolu;
/**
* @author 林高禄
* @create 2020-05-08-16:28
*/
public class ShellSort {
public static void main(String[] args) {
int[] arr = {5,2,8,99,4,77,83,22,45,25,47,64};
sort(arr);
println(arr);
}
// 希尔排序
public static void sort(int[] arr){
if(null == arr){
return;
}
int length = arr.length;
for(int h=length>>1;h>0;h=h>>1){
for(int i=h;i<length;i++){
for(int j=i;j>h-1;j-=h){
if(arr[j]<arr[j-h]){
swap(arr,j,j-h);
}
}
}
}
}
public static void swap(int[] arr,int i,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void println(int[] arr){
if(null == arr){
System.out.println("数组为空");
return;
}
int length = arr.length;
StringBuffer s = new StringBuffer();
s.append("[");
for(int i=0;i<length;i++){
if(i==0){
s.append(arr[i]);
}else{
s.append(",").append(arr[i]);
}
}
s.append("]");
System.out.println(s);
}
}
我们这里的间隔是按集合的长度对半分,但是试验证明效率最高的间隔是
Kunth序列:h = 3*h+1
所以我们把代码改进一下
package com.lingaolu;
/**
* @author 林高禄
* @create 2020-05-08-16:28
*/
public class ShellSort {
public static void main(String[] args) {
int[] arr = {5,2,8,99,4,77,83,22,45,25,47,64};
sort(arr);
println(arr);
}
// 希尔排序
public static void sort(int[] arr){
if(null == arr){
return;
}
int g = 1;
int length = arr.length;
while(g <= length/3){
g = g*3+1;
}
for(int h=g;h>0;h=(h-1)/3){
for(int i=h;i<length;i++){
for(int j=i;j>h-1;j-=h){
if(arr[j]<arr[j-h]){
swap(arr,j,j-h);
}
}
}
}
}
public static void swap(int[] arr,int i,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void println(int[] arr){
if(null == arr){
System.out.println("数组为空");
return;
}
int length = arr.length;
StringBuffer s = new StringBuffer();
s.append("[");
for(int i=0;i<length;i++){
if(i==0){
s.append(arr[i]);
}else{
s.append(",").append(arr[i]);
}
}
s.append("]");
System.out.println(s);
}
}