数据结构与算法之希尔排序

前面学习了插入排序,这一章节我们将学习一个插入排序的升级版----希尔排序。

希尔排序的基本思想就是一个分组的插入排序。首先需要设定一个步长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;
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/qq_21963133/article/details/79797216