希尔排序是对插入排序的一种改进。
下面对希尔排序的介绍来自于维基百科
*希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率
但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位
下面是代码实现
package com.neway.sort;
/**
* Created by Neway on 2015/12/6.
*/
public class ShellSort implements Sort {
public static void main(String args[]) {
int arr[] = {13,14,94,33,82,25,59,94,65,23,45,27,73,25,39,10};
Sort sort = new ShellSort();
sort.sort(arr);
for (int i : arr) {
System.out.print(i + " ");
}
}
@Override
public void sort(int[] arr) {
int step = 5;
while (step > 0) {
int x = (arr.length / step ) ;
for (int i = 0; i < arr.length / x; i++) {
int stepArray[] = new int[x];
for (int m = 0; m < x; m++) {
stepArray[m] = arr[m * step + i];
}
insertSort(stepArray);
for (int m = 0; m < x; m++) {
arr[m * step + i] = stepArray[m];
}
}
step = step / 2;
}
}
public void insertSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int insertPosition = -1;
int cache = arr[i]; //缓存当前的值
//从前面排好序的数字中间找到第一个大于当前数字的,它的位置就是当前数字应该在的位置。
for (int m = 0; m < i; m++) {
if (arr[i] < arr[m]) {
insertPosition = m;
break;
}
}
//如果找到了了,就把数字依次往后移动一位。
if (insertPosition != -1) {
for (int j = i; j > insertPosition && insertPosition != -1; j--) {
arr[j] = arr[j - 1];
}
// 把当前数字放到腾出来的位置上去。
arr[insertPosition] = cache;
}
}
}
}