基于Python3的数据结构与算法 - 09 希尔排序

一、引入

希尔排序是一种分组插入排序的算法。

二、排序思路

  1. 首先取一个整数d1 = n/2,将元素分为d1个组,每组相邻量取元素距离为d1,在各组内直接进行插入排序;
  2. 取第二个整数d2 = d1/2, 重复上述分组排序过程,直到d1 = 1,即所有元素在同意最内进行直接插入排序。
  3. 希尔排序每趟并不使某些元素有序,而是使整体数据越来越接近有序;最后一趟排序使得所有数据有序。

如下图所示:n = 9 ; d1 = n // 2 = 4 ; 第一次将其分为四组;每组进行一次插入排序,排序完成后返回。

第二次将其分为 d1 = d // 2  = 2组后再重新进行插入排序:

直到最后d = 1时,再对整体进行一次插入排序

 

三、代码思路

1. 按照间隔为gap的插入

### 数据结构算法中的查找和排序 #### 查找算法概述 查找是指在一个数据集合中寻找特定元素的过程。常见的查找算法包括顺序查找、二分查找(也称为折半查找)、哈希查找等。对于不同的应用场景,选择合适的查找方式至关重要。 - **顺序查找**适用于无序列表,在最坏情况下需要遍历整个列表才能找到目标项。 - **二分查找**则针对有序数组实现高效的搜索操作,通过不断缩小范围来定位目标位置[^2]。 ```python def binary_search(arr, target): low, high = 0, len(arr) - 1 while low <= high: mid = (low + high) // 2 if arr[mid] == target: return mid elif arr[mid] < target: low = mid + 1 else: high = mid - 1 return -1 ``` #### 排序算法分类及其特点 排序是对一组对象按照某种规则重新排列的过程。根据是否依赖于比较运算符可分为两大类: - **基于比较的排序**:如冒泡排序、插入排序、希尔排序、快速排序以及堆排序等;这类方法的时间复杂度通常不低于 O(n log n),其中 n 表示待处理的数据量。 - **非基于比较的排序**:例如计数排序、基数排序和桶排序,这些技术利用了数值本身的特性来进行排序,可以在某些特殊条件下达到线性时间性能O(n)。 ##### 堆排序简介 堆是一种特殊的完全二叉树结构,可以分为最大堆和最小堆两种形式。在构建好初始的最大(小)堆之后,可以通过反复取出根节点并重建堆的方式完成升序或降序排列的任务。具体来说,堆排序主要涉及两个核心步骤:建堆过程和调整过程[^3]。 ```c++ void heapify(int arr[], int n, int i){ int largest = i; int l = 2*i + 1; int r = 2*i + 2; if(l<n && arr[l]>arr[largest]) largest=l; if(r<n && arr[r]>arr[largest]) largest=r; if(largest!=i){ swap(&arr[i],&arr[largest]); heapify(arr,n,largest); } } void heapsort(int arr[],int n){ for(int i=n/2-1;i>=0;i--) heapify(arr,n,i); for(int i=n-1;i>0;i--){ swap(&arr[0],&arr[i]); heapify(arr,i,0); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一道秘制的小菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值