-
基本介绍
希尔排序是希尔在1959年提出的一种排序算法,也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也成为缩小增量排序
-
基本思想
-
package com.gcy.sort;
import java.util.Arrays;
import org.omg.CORBA.PUBLIC_MEMBER;
/**
* 希尔排序
* @author Administrator
*
*/
public class ShellSort {
public static void main(String[] args) {
int [] arr= {8,9,1,7,2,3,5,4,6,0};
System.out.println("排序前的数组"+Arrays.toString(arr));
//shellSort(arr);
shellSort2(arr);
System.out.println("排序后的数组"+Arrays.toString(arr));
}
/**
* 希尔排序交换法
* @param arr
*/
public static void shellSort(int [] arr) {
int temp=0;
for(int gap=arr.length/2;gap>0;gap/=2) {
for(int i=gap;i<arr.length;i++) {
for(int j=i-gap;j>=0;j-=gap) {
//如果当前元素大于加上步长后的元素,就需要交换
if(arr[j]>arr[j+gap]) {
temp=arr[j];
arr[j]=arr[j+gap];
arr[j+gap]=temp;
}
}
}
}
}
/**
* 对交换式的希尔排序进行优化————》使用移位法
* @param arr
*/
public static void shellSort2(int [] arr) {
for(int gap=arr.length/2;gap>0;gap/=2) {
//从第gap个元素,逐个对其所在的组进行直接插入排序
for(int i=gap;i<arr.length;i++) {
int j=i;
int temp=arr[j];
if(arr[j]<arr[j-gap]) {
while(j-gap>=0 && temp<arr[j-gap]) {
//移动
arr[j]=arr[j-gap];
j-=gap;
}
//当while循环退出后,就给temp找到了插入的位置
arr[j]=temp;
}
}
}
}
//具体的分析
/*int temp=0;
//希尔排序第一轮排序
//因为第一轮排序,是将10个元素分成了5组
for(int i=5;i<arr.length;i++) {
for(int j=i-5;j>=0;j-=5) {
//如果当前元素大于加上步长后的元素,就需要交换
if(arr[j]>arr[j+5]) {
temp=arr[j];
arr[j]=arr[j+5];
arr[j+5]=temp;
}
}
}
System.out.println("希尔排序第一轮排序后"+Arrays.toString(arr));*/
}
结果: