希尔排序,也称缩小增量排序或shell排序,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。
希尔排序算法的运作如下:
1. 将有n个元素的数组分为n/2个数字序列,第1个数据和第n/2+1个数据为一对,......
2.一次循环使每一个序列对排好顺序;
3.然后,再变成n/4个序列对,再次排序;
4.不断重复上述过程,直到序列减少最后变为一个,也就完成了整个排序。
package cn.kimtian.sort;
import java.util.Arrays;
/**
* 这是一个希尔排序
*
* @author kimtian
*/
public class ShellSort {
public static void main(String[] args) {
int[] arr = {2, 5, 3, 7, 1, 8, 3, 9, 0};
shellSort(arr);
System.out.println(Arrays.toString(arr));
}
/**
* 这是一个希尔排序
* {1,5,3,7,2,8,3,9,0}
*
* @param arr 数组
* 初始:{2,5,3,7,1,8,3,9,0}
* 第一轮:{0,5,3,7,1,8,3,9,2};
* 第二轮:{0,5,1,7,2,8,3,9,3};
* 第三轮:{0,1,2,3,3,5,7,8,9};
*/
public static void shellSort(int[] arr) {
for (int d = arr.length / 2; d > 0; d /= 2) {
//遍历所有的元素
for (int i = d; i < arr.length; i++) {
//遍历本组中所有的元素
for (int j = i - d; j >= 0; j -= d) {
//如果当前元素大于加上步长后的元素
if (arr[j] > arr[j + d]) {
int temp = arr[j];
arr[j] = arr[j + d];
arr[j + d] = temp;
}
}
}
}
}
}