• 数据结构之八大排序——希尔排序



    直接插入排序算法的时间复杂度为O(n^{2}),如果待排序的序列为"正序"时,时间复杂度为O(n),但是如果比较大的数字在第一个位置,那么进行排序的话需要一直移动到最后一位,比较适合基本有序的排序和数据量不大的排序。希尔排序基于这两点分析对直接插入排序进行改进


    目录

    一、排序过程

    二、代码

    三、性能及稳定性分析

    1.空间复杂度

    2.时间复杂度

    3.稳定性


    一、排序过程

    先将待排序的序列表分割成若干形如L[i,i+d,i+2d,...,i+kd]的“特殊”子表,即把相隔某个“增量”的记录组成一个子表,对每个子表进行直接插入排序,当执行到表中的元素基本有序的时候,在对全体元素进行一次直接插入排序。

    固定增量的计算为d=n/2,d_{i+1}=\left \lfloor d_{i}/2 \right \rfloor,并且最后一个增量为1。

    推荐一个关于数据结构的网站里面有很多知识,排序、堆栈、索引等。数据结构

    示意图:(后面几轮和前面几轮思想一样,所以速度加快了)

    希尔排序

    二、代码

    1. package sort;
    2. /**
    3. * @author The丶Alanx
    4. */
    5. public class ShellSort {
    6. public static void main(String[] args) {
    7. int[] arr = {3, 6, 4, 1, 9, 6, 5, 8, 7, 2};
    8. System.out.println("排序前为:");
    9. for (int i : arr) {
    10. System.out.print(i + " ");
    11. }
    12. System.out.println();
    13. shellsort(arr, arr.length);
    14. System.out.println("排序后为:");
    15. for (int i : arr) {
    16. System.out.print(i + " ");
    17. }
    18. }
    19. public static void shellsort(int[] arr, int n) {
    20. int temp = 0;
    21. for (int dk = n / 2; dk >= 1; dk = dk / 2) { //步长变化
    22. for (int i = dk; i < n; i++) {
    23. if (arr[i] < arr[i - dk]) { //将arr[i]插入有序增量子表
    24. temp = arr[i]; //中间变量存放在temp
    25. for (int j = i - dk; j >= 0 && temp < arr[j]; j -= dk) {
    26. arr[j + dk] = arr[j]; //记录后移,查找插入的位置
    27. arr[j] = temp; //插入
    28. }
    29. }
    30. }
    31. }
    32. }
    33. }

    第一趟排序过程: 

    结果:

      

    三、性能及稳定性分析

    1.空间复杂度

    因为排序的整个过程中,仅在当前的数组中操作,没有使用另一个空数组,仅使用了常熟个辅助单元,因此时间复杂度为O(1)

    2.时间复杂度

    因为希尔排序的时间复杂度和增量序列函数有关系,所以当n在某个特定范围内,希尔排序的时间复杂度约为O(n^{1.3}),在最坏情况下希尔排序的时间复杂度为O(n^{2})

    3.稳定性

    由上上图对希尔排序第一趟的分析,黑色的6开始在前面蓝色的6在后面,而排完序后黑色的6在蓝色6的后面,当相同关键字的记录被划分到不同的子表时,可能会改变他们的顺序。因此希尔排序是一个不稳定的排序。


  • 相关阅读:
    Matlab(数值微积分)
    第6章 如何产生优秀的 Micro SaaS 创意
    快速排序
    Python编程实例-音频数据可视化
    新闻主题分类任务——torchtext 库进行文本分类
    JavaScript---BOM和DOM
    【leetocde】128. 最长连续序列
    知虾数据软件:电商人必备知虾数据软件,轻松掌握市场趋势
    [山东科技大学OJ]1053 Problem C: Matrix Problem (III) : Array Practice
    IP RAN基站回传中的三大组网方案
  • 原文地址:https://blog.csdn.net/weixin_55166132/article/details/125790345