前面学习了插入排序,这一章节我们将学习一个插入排序的升级版----希尔排序。
希尔排序的基本思想就是一个分组的插入排序。首先需要设定一个步长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这五个元素为一组,进行插入排序
扫描二维码关注公众号,回复:
125547 查看本文章
第三次: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; } } }