插入排序之希尔排序

算法思路:

先取一个小于 n 的整数 d_1 作为第一个增量,把文件的全部记录分组。所有距离为 d_1 的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量 d_{2}<d_{1} 重复上述的分组和排序,直至所取的增量d_{t}=1(d_{t}<d_{t-1}<\cdots <d_{2}<d_{1}),即所有记录放在同一组中进行直接插入排序为止。

该方法实质上是一种分组插入方法。

时间复杂度:

希尔排序的平均时间复杂度为O(nlogn)

 空间复杂度:

希尔排序使用了插入排序的方法,所以空间复杂度和插入排序相同,O(1)

 稳定性:

是不稳定。由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以希尔排序是不稳定的。

代码实现:

c++代码

void shellSort(int ls[], int len) {
    
    int temp = 1;
    while (temp < len/3) {
        temp = 3*temp+1;
    }
    
    while (temp >= 1) {
        for (int i=temp; i<len; i++) {

            //对ls[i], ls[i-h], ls[i-2h], 使用插入排序法

            int e = ls[i];
            int j;
            for (j=i; j>=temp; e<ls[j-temp]; j-=temp) {

                ls[j] = ls[j-temp];

            }
            ls[j] = e;
        }
        temp /= 3;
    }
}
import math
def shellSort(ls):
   
    temp=1
    while(temp < len(ls)/3):
        temp = temp*3+1
    while temp > 0:
        for i in range(temp,len(ls)):
            gap = ls[i]
            j = i-temp
            while j >=0 and ls[j] > gap:
                ls[j+temp]=ls[j]
                j-=temp
            ls[j+temp] = gap
        temp = math.floor(temp/3)
    return ls
ls = [0,11,52,458,8]
print(shellSort(ls))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
插入排序希尔排序都是常见的排序算法,适用于C语言编程。 插入排序是一种简单直观的排序算法,它的基本思想是将待排序的元素逐个插入到已排序序列中的适当位置,直到全部元素都插入完毕。具体实现时,可以使用两重循环,外层循环控制待插入的元素,内层循环将待插入元素与已排序序列中的元素进行比较并移动位置。\[2\] 希尔排序插入排序的一种改进算法,它通过将待排序序列分割成若干个子序列,对每个子序列进行插入排序,然后逐步缩小子序列的间隔,最终完成整个序列的排序。希尔排序的关键在于选择合适的间隔序列,常用的间隔序列有希尔增量序列和Hibbard增量序列等。\[2\] 以下是插入排序希尔排序的C语言代码示例: 插入排序: ```c void InsertionSort(int arr\[\], int n) { int i, j, key; for (i = 1; i < n; i++) { key = arr\[i\]; j = i - 1; while (j >= 0 && arr\[j\] > key) { arr\[j + 1\] = arr\[j\]; j--; } arr\[j + 1\] = key; } } ``` 希尔排序: ```c void ShellSort(int arr\[\], int n) { int gap, i, j, temp; for (gap = n / 2; gap > 0; gap /= 2) { for (i = gap; i < n; i++) { temp = arr\[i\]; for (j = i; j >= gap && arr\[j - gap\] > temp; j -= gap) { arr\[j\] = arr\[j - gap\]; } arr\[j\] = temp; } } } ``` 以上是插入排序希尔排序的简单实现,你可以根据需要进行修改和优化。 #### 引用[.reference_title] - *1* *2* *3* [C语言实现排序算法:冒泡排序、插入排序希尔排序、堆排序、归并排序](https://blog.csdn.net/m0_72084056/article/details/126280789)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值