八大排序算法~希尔排序【改良版的直接插入排序】

简介: 八大排序算法~希尔排序【改良版的直接插入排序】

八大排序算法~希尔排序【改良版的直接插入排序】


直接插入排序文章:https://www.cnblogs.com/shan333/p/15043607.html

✿●✿希尔排序思想由来~先思考直接插入排序在什么情况下效率比较高?

        62.png

希尔排序思想:
先将整体待排记录序列分割成若干个子序列,分别进行直接插入排序,
待整个序列中的记录“基本有序”时,再对全体进行一次直接插入排序。

 

1,为什么需要改良直接插入排序,以及改良后的希尔排序实现了什么效果?

希尔排序:对直接插入排序的改良版,原来的直接排序面对大量数的效率太低了,需要先对待排序数据进行处理,

(希尔排序就是通过取一定间隔进行数据处理,

使得小的数基本在前边,大的数基本在后边使得整体的数字看起来是基本有序的

2,如何实现希尔排序?

(1)希尔排序通过取某个“间隔”对原整体的数据进行分组

【不断以 某间隔划分有序区跟无序区,然后遍历无序区数据,跟有序区数据比较,找合适位置】。然后这个“间隔”缩小,再分组;“间隔”再缩小,再分组直到“间隔”为1,进行最后的分组就是数据本身的整体了。(间隔的取值是整体数据的一半,即d=n/2)

(2)然后小组内部需要直接排序

(3)图解:引自《数据结构c语言版严蔚敏PPT.pdf ~

 https://wenku.baidu.com/view/9e73cb8b69dc5022aaea00c1.html

63.png

 

 

3,代码逻辑分析:

第一层循环(间隔循环地缩小,直到间隔为1):for(int i = n/2; i >=1; i = i/2)
外循环(不断地取出无序区的数):for(j = 1 + i; j <=n; j++)
~1+i 无序区离有序区的距离是i,初始时,有序区只在第一个位置
内循环(取出的数不断地与有序区做比较,找到一个合适位置插入):for(k = j – i; r[0] < r [k] && k > 0; k = k – i)  
~有序区离无序区的距离是i,无序区第一个数距离i前就是有序区的最后一个数

4,直接上代码,分析如上:

for(int i = n/2; i >=1; i = i/2){
    for(j = 1 + i; j <=n; j++){
       arr[0] = arr[j];            //哨兵元素,作用:可以不用再添加额外的辅助空间;省去对数组下标越界的判断
        for(k = j – i; arr[0] < arr [k] && k > 0; k = k – i){    //边比较,边移动数组空间
         arr[k + i] = arr[k];
     }
    arr[k + i] = arr[0];
  }
}

 

目录
相关文章
|
2月前
|
算法 搜索推荐 Shell
数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)
这篇文章介绍了希尔排序、快速排序和归并排序三种排序算法的基本概念、实现思路、代码实现及其测试结果。
24 1
|
2月前
|
算法 搜索推荐
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
本文介绍了冒泡排序、选择排序和插入排序三种基础排序算法的原理、实现代码和测试结果。
21 0
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
|
6月前
|
算法 搜索推荐
数据结构算法--6 希尔排序和计数排序
**希尔排序**是插入排序的改进版,通过分组插入来提高效率。它逐步减少元素间的间隔(增量序列),每次对每个间隔内的元素进行插入排序,最终增量为1时进行最后一次直接插入排序,实现整体接近有序到完全有序的过程。例如,对数组`5, 7, 4, 6, 3, 1, 2, 9, 8`,先以间隔`d=4`排序,然后`d=2`,最后`d=1`,完成排序。计数排序则适用于0到100的数值,通过统计每个数出现次数,创建对应计数数组,再根据计数重建有序数组,时间复杂度为`O(n)`。
|
2月前
|
搜索推荐 算法
【排序算法(一)】——插入排序,选择排序 —> 深层解析
【排序算法(一)】——插入排序,选择排序 —> 深层解析
|
5月前
|
算法 搜索推荐 C#
|
6月前
|
机器学习/深度学习 算法 搜索推荐
数据结构算法--2 冒泡排序,选择排序,插入排序
**基础排序算法包括冒泡排序、选择排序和插入排序。冒泡排序通过相邻元素比较交换,逐步将最大值“冒”到末尾,平均时间复杂度为O(n^2)。选择排序每次找到剩余部分的最小值与未排序部分的第一个元素交换,同样具有O(n^2)的时间复杂度。插入排序则类似玩牌,将新元素插入到已排序部分的正确位置,也是O(n^2)复杂度。这些算法适用于小规模或部分有序的数据。**
|
6月前
|
算法 搜索推荐
数据结构与算法-插入排序
数据结构与算法-插入排序
32 2
|
6月前
|
算法 搜索推荐 数据可视化
【漫画算法】插入排序:插入宝石的传说
【漫画算法】插入排序:插入宝石的传说
|
5月前
|
算法 搜索推荐 Shell
|
6月前
|
人工智能 搜索推荐 JavaScript
心得经验总结:排序算法:插入排序法(直接插入法和希尔排序法)
心得经验总结:排序算法:插入排序法(直接插入法和希尔排序法)
40 0