希尔排序算法

简介: 希尔排序算法

文章目录

  1. 算法思想
  2. 算法图解
  3. 代码实现
  4. 算法特点

插入排序算法详解

  1. 算法思想

常用的增量序列有:

  1. 算法图解

int[] array = {77,20,31,5,8,9,11,33,22,88,99,35};
以数组array排升序为例:

希尔排序图解

第一个增量为6,则原始数组被分为6组,组内的每个元素下标之差为6,然后对这6组进行插入排序

第二个增量为3,则第一次排序后数组被分为三组,组内每个元素之间数组下标之差为3 ,这三组分别进行插入排序

第三个增量为1,则第二次排序后数组被分为1组,进行插入排序

结果为:

至此希尔排序完成

  1. 代码实现

代码:

import java.util.Arrays;

public class ShellSort {

public int[] sortArray(int[] nums){
    int len = nums.length;
    //按增量分组后,每个分组中temp代表当前待排序数据,该元素之前的组内元素均已被排过
    //gap只用来分组的增量,会依次递减
    int currentValue,gap = len / 2;
    while(gap>0){
        for (int i = gap; i < len; i++) {
            currentValue = nums[i];
            //组内已被排序数据的索引
            int preIndex = i - gap;
            //在组内已被排序过的数据中倒序寻找合适的位置,如果当前待排序数据比比较的元素要小,
            // 则将比较的元素在组内后移一位
            while(preIndex>=0 && nums[preIndex] > currentValue){
                nums[preIndex+gap]=nums[preIndex];
                preIndex -= gap;
            }
            //当while循环结束时,说明找到了当前待排序数据的合适位置插入数据
            nums[preIndex+gap] = currentValue;
        }
        System.out.println("本轮增量:"+gap+"     排序后的数组:");
        PrintArray.print(nums);
        System.out.println("----------");
        gap/=2;
    }
    return nums;
}

public static void main(String[] args) {
    int[] array = {77,20,31,5,8,9,11,33,22,88,99,35};
    ShellSort shellSort = new ShellSort();
    shellSort.sortArray(array);
}

}
class PrintArray{

public static void print(int[] nums){
    System.out.println(Arrays.toString(nums));
}

}

  1. 算法特点

时间复杂度:n和d的函数:O(n^1.25)~  O(1.6n^1.25)

空间复杂度: O(1)

希尔排序每一趟移动,移动位置较大,跳跃式地接近排序后的最终位置
增量序列必须是递减的,最后一个必须是1(对整体进行直接插入排序)
希尔排序是一种不稳定的排序方法,且不宜在链式存储结构上实现
希尔排序通过降低比较次数和移动次数来提高排序的效率

相关文章
|
2月前
|
算法 搜索推荐 Shell
数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)
这篇文章介绍了希尔排序、快速排序和归并排序三种排序算法的基本概念、实现思路、代码实现及其测试结果。
29 1
|
6月前
|
算法 搜索推荐
数据结构算法--6 希尔排序和计数排序
**希尔排序**是插入排序的改进版,通过分组插入来提高效率。它逐步减少元素间的间隔(增量序列),每次对每个间隔内的元素进行插入排序,最终增量为1时进行最后一次直接插入排序,实现整体接近有序到完全有序的过程。例如,对数组`5, 7, 4, 6, 3, 1, 2, 9, 8`,先以间隔`d=4`排序,然后`d=2`,最后`d=1`,完成排序。计数排序则适用于0到100的数值,通过统计每个数出现次数,创建对应计数数组,再根据计数重建有序数组,时间复杂度为`O(n)`。
|
5月前
|
算法 搜索推荐 Shell
|
6月前
|
人工智能 搜索推荐 JavaScript
心得经验总结:排序算法:插入排序法(直接插入法和希尔排序法)
心得经验总结:排序算法:插入排序法(直接插入法和希尔排序法)
45 0
|
6月前
|
机器学习/深度学习 搜索推荐 算法
【C/排序算法】:直接插入排序和希尔排序
【C/排序算法】:直接插入排序和希尔排序
49 0
|
6月前
|
搜索推荐
排序算法---希尔排序---详解&&代码
排序算法---希尔排序---详解&&代码
|
6月前
|
算法 Shell C语言
数据结构与算法——希尔排序(引例、希尔增量序列、原始希尔排序、代码、时间复杂度、Hibbard增量序列、Sedgewick增量序列)
数据结构与算法——希尔排序(引例、希尔增量序列、原始希尔排序、代码、时间复杂度、Hibbard增量序列、Sedgewick增量序列)
70 0
|
7月前
|
算法 前端开发 搜索推荐
前端算法之希尔排序
前端算法之希尔排序
36 0
|
7月前
|
搜索推荐 算法 Java
sort-06-shell sort 希尔排序算法详解
这是一个关于排序算法的系列文章摘要。文章汇总了各种排序算法,包括冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序、归并排序、计数排序、桶排序以及大文件外部排序。特别地,希尔排序是一种改进的插入排序,通过使用不同的步长对元素进行分组排序,以提高效率。算法最终以较小的步长进行排序,接近线性时间复杂度。文章还提供了Java代码实现,并举例说明了希尔排序的过程。所有内容可在开源项目[https://github.com/houbb/sort](https://github.com/houbb/sort)中找到。
|
7月前
|
人工智能 算法 搜索推荐
直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序——“数据结构与算法”
直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序——“数据结构与算法”