排序第四章:希尔排序

希尔排序是一种改进的插入排序算法,通过增量序列实现批量移动记录,从而提高排序效率。其时间复杂度为O(n^(3/2)),优于直接插入排序的O(n²)。虽然增量序列的选择没有最优标准,但希尔排序在某些情况下(如记录基本有序或数量较少)表现出较高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#define MAX_SIZE 10
typedef struct
{
int m[MAX_SIZE ];
int length;

} SqList;

//用排序,铁定跑不了这个swap函数,最好自己写一个

void swap(SqList *q, int i, int j);

void swap(SqList *q, int i, int j)
{
int temp = q->m[i];
q->m[i] = q->m[j];
q->m[j] = temp;

}


/*希尔排序,前面介绍的三种排序的时间复杂度都是O(n*n)

而这一次的希尔排序是第一批突破O(n*n)的排序算法

他的核心精髓是那个增量序列,每一次移动都是一个批量的序列移动

可是他应该选择什么作为增量呢?这一点,只能凭感觉了,没有确凿的数据证明,哪个是最好的增量序列,

自己根据实践去开发

希尔排序的时间复杂度是O(n^3/2)就是n的二分之三次方;要好过前面几章的N的平方!!!!

*/

/*前面的直接插入排序,有些时候效率是很高的,比如当记录本身就是有序的,只需要少许的插入操作,即可。

还有就是记录少的时候,也很高效,而这个希尔排序,其实和直接插入排序有点相像的,自己注意看啊!!!

*/

void shellsort(SqList *L)
{
int i, j, incream;
incream = L->length;
do
{
incream = incream / 3 + 1;    //增量序列
for (i = incream + 1; i <= L->length; i++)
{
if (L->m[i] < L->m[i - incream])
{    
L->m[0] = L->m[i];
for (j = i - incream; j > 0 && L->m[j] > L->m[0]; j -= incream)
{
L->m[j + incream] = L->m[j];//记录后移, 查找插入位置
}
L->m[j + incream] = L->m[0];    //插入
}
}
} while (incream > 1);


}
### 希尔排序算法的实现与优化 希尔排序(Shell Sort)是一种基于插入排序的高效改进算法。通过将待排序序列分割为若干个子序列,分别对每个子序列进行插入排序,从而减少整体的比较和移动次数[^1]。 #### 一、希尔排序的基本实现 希尔排序的核心思想是分组排序。首先选择一个增量序列(gap sequence),然后按照这个增量将数组分成多个子序列,并对每个子序列执行插入排序。随着增量逐渐减小,最终当增量为1时,整个数组成为一个子序列,此时再进行一次完整的插入排序。 以下是希尔排序的基本实现代码示例: ```python def shell_sort(arr): n = len(arr) gap = n // 2 # 初始增量为数组长度的一半 while gap > 0: for i in range(gap, n): temp = arr[i] j = i while j >= gap and arr[j - gap] > temp: arr[j] = arr[j - gap] j -= gap arr[j] = temp gap //= 2 # 每次将增量减半 # 示例使用 arr = [64, 34, 25, 12, 22, 11, 90] shell_sort(arr) print("Sorted array:", arr) ``` 上述代码中,`gap` 是增量序列,初始值为数组长度的一半,随后每次迭代将其减半,直到 `gap` 等于1[^4]。 #### 二、希尔排序的优化方法 1. **增量序列的选择** 增量序列的选择对希尔排序的性能有显著影响。经典的希尔增量序列(n/2, n/4, …, 1)虽然简单易用,但并不是最优的选择。Hibbard 提出的增量序列 (1, 3, 7, 15, 31, ...) 和 Sedgewick 提出的增量序列 (1, 5, 19, 41, 109, ...) 能够在某些情况下提供更好的性能表现[^2]。 2. **动态调整增量** 在实际应用中,可以根据数据分布动态调整增量序列,以适应不同的输入情况。例如,对于部分有序的数据,可以适当减少增量序列的步长,从而提高效率。 3. **结合其他排序算法** 希尔排序可以与其他排序算法结合使用。例如,在增量较小时,可以切换到快速排序或归并排序,以进一步提升性能。 #### 三、希尔排序的时间复杂度 希尔排序的时间复杂度取决于所选的增量序列。经典增量序列的时间复杂度为 O(n^2),而优化后的增量序列可以将时间复杂度降低到接近 O(n log n)[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值