前面学习了插入排序,这一章节我们将学习一个插入排序的升级版----希尔排序。
希尔排序的基本思想就是一个分组的插入排序。首先需要设定一个步长gap(一般设置为数组长度除以2),然后当我们需要对元素i进行排序时,只需将......i+gap+gap,i+gap,i、i-gap、i-gap-gap....这些元素进行插入排序即可(i+x*gap<n,i-y*gap>=0)。
待排序数组:3,5,7,2,4,9,6,8,1,0
第一次:步长为5,第6个元素跟第一个元素为一组进行插入排序,3,9。
第7个元素跟第二个元素为一组进行插入排序,5,6。
第8个元素跟第二个元素为一组进行插入排序,7,8。
第9个元素跟第二个元素为一组进行插入排序,1,2。
第10个元素跟第二个元素为一组进行插入排序,0,4。
第二次:步长为2,第1、3、5、7、9这五个元素为一组,进行插入排序,
第2、4、6、8、10这五个元素为一组,进行插入排序
第三次:gap=1,对整个数组进行插入排序。
根据示意图不难写出代码。
public class ShellSort {
/**
* @author:kevin
* @Description: 基础排序
* @Date:23:25 2018/4/2
*/
public void sort(int[] arr, int n){
for (int gap = n/2; gap>0; gap/=2) {
for (int i = gap; i < n; i+=gap) {
for (int j = i; j-gap>=0; j = j-gap) {
if (arr[j] < arr[j-gap]){
SortUtil.swap(arr, j, j-gap);
}
}
}
}
}
/**
* @author:kevin
* @Description: 优化
* @Date:23:25 2018/4/2
*/
public void sort1(int[] arr, int n){
for (int gap = n/2; gap>0; gap/=2) {
for (int i = gap; i < n; i+=gap) {
int j = i;
int temp = arr[i];
for (; j-gap>=0 &&temp < arr[j-gap]; j = j-gap) {
arr[j] = arr[j-gap];
}
arr[j] = temp;
}
}
}