ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-07-26 00:34:44  阅读:178  来源: 互联网

标签:arr 排序 temp -- 插入排序 gap int 数据结构


简介

希尔排序是插入排序的一种,又称“缩小增量排序”,是插入排序算法的一种更高效的改进版本


排序图解

从图中可以看出每一趟排序中都分成 gap 组,每组都有 gap + 1 个元素,对每一组中的 arr[j] 和 arr[j - gap] 进行比较,如果 arr[j] < arr[j - gap] 则相互交换值

gap 初始值为原数组长度的一半,随后在其他趟次排序中 gap 值变为原来的一半,直到 gap 的值变为 0 后,数组中的元素变得有序  


排序原理

  1. 选定一个增长量h,按照增长量h作为数据分组的依据,对数据进行分组

  2. 对分好组的每一组数据完成插入排序

  3. 减小增长量,最小减为1,重复第二步操作,知道增长量为0


代码实现

交换法

public void shellSort(int[] arr){
    int gap = arr.length / 2;
    while (gap > 0) {
        for (int i = gap; i < arr.length; i++) {
            //遍历各组中所有的元素(共gap组,每组有gap+1个元素),步长为gap
            for (int j = i - gap; j >= 0; j -= gap) {
                //如果当前元素大于加上步长gap后的那个元素,则交换值
                if (arr[j] > arr[j + gap]){
                    exchange(arr,j,j + gap);
                }
            }
        }

        //增量gap逐步进行缩小
        gap = gap / 2;
    }
}

public void exchange(int[] arr, int j, int i) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

移位法

public void shellSort2(int[] arr){
    int gap = arr.length / 2;
    while (gap > 0) {
        //从第gap个元素,主格对比所在的组进行直接插入排序
        for (int i = gap; i < arr.length; i++) {
            int j = i;
            int temp = arr[j];
            if (arr[j] < arr[j - gap]){
                
                while (j - gap >= 0 && temp < arr[j - gap]){
                    //移动
                    arr[j] = arr[j - gap];
                    j -= gap;
                }
                
                //当退出while循环后,就给temp找到了插入的位置
                arr[j] = temp;
            }
        }

        //增量gap逐步进行缩小
        gap = gap / 2;
    }
}

public void exchange(int[] arr, int j, int i) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

时间复杂度分析

通过测试发现,在处理大批量数据时,希尔排序的性能确实高于插入排序

  • 最优时间复杂度:根据步长序列的不同而不同

  • 最坏时间复杂度:O(N2)


算法稳定性

对于相同的两个数,可能由于分在不同的组中而导致它们的顺序发生变化。如图解中的两个5,在排完序后两者的位置发生了变化。所以希尔排序是不稳定的

标签:arr,排序,temp,--,插入排序,gap,int,数据结构
来源: https://www.cnblogs.com/52-IT-y/p/16519341.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有