模糊PID控制主动悬架模型 基于2自由度1/4悬架模型,模糊PID可以自适应调整PID控制的系数
2026/4/1 22:18:44
一、希尔排序
算法逻辑
希尔排序采用“增量分组插入排序”的策略。初始时设定一个增量(通常为数组长度的一半),将相隔该增量的元素组成一个子序列,对每个子序列进行直接插入排序;然后逐步缩小增量(如每次除以2),重复分组和排序过程,直到增量减为1,最后进行一次直接插入排序完成整体有序。
代码实现中,外层循环控制增量变化(从n//2逐渐减至1),内层循环对每个子序列执行插入排序操作。由于前期通过较大增量快速调整元素位置,避免了小元素远距离移动,提高了效率。
defshell_sort(arr):n=len(arr)gap=n//2# 初始增量whilegap>0:foriinrange(gap,n):temp=arr[i]j=i# 对相隔gap的元素进行插入排序whilej>=gapandarr[j-gap]>temp:arr[j]=arr[j-gap]j-=gap arr[j]=temp gap//=2# 缩小增量returnarr算法特性
二、快速排序
基本思想
基于分治法:选择一个基准元素(枢轴 pivot),将序列划分为两个子序列——左子序列所有元素 ≤ pivot,右子序列所有元素 ≥ pivot;再递归地对左右两部分进行快排,最终使整个序列有序。
划分过程(Partition)详解
以data[low]作为 pivot,设置两个指针:
i = low(从左向右找大于 pivot 的元素)j = high(从右向左找小于 pivot 的元素)步骤如下:
temp = data[low]i < j时循环:j向前移动,直到找到第一个< temp的元素,将其赋值给data[i]i向后移动,直到找到第一个> temp的元素,将其赋值给data[j]i == j,此时将temp放入data[i],pivot 归位defpartition(arr,low,high):pivot=arr[low]i,j=low,highwhilei<j:whilei<jandarr[j]>=pivot:j-=1ifi<j:arr[i]=arr[j]whilei<jandarr[i]<=pivot:i+=1ifi<j:arr[j]=arr[i]arr[i]=pivotreturnidefquick_sort(arr,low,high):iflow<high:pi=partition(arr,low,high)quick_sort(arr,low,pi-1)quick_sort(arr,pi+1,high)算法特性
Shell 原始序列(最原始)
Knuth 序列
Hibbard 序列
Sedgewick 序列
Ciura 序列(经验序列)
| 增量序列 | 最坏时间复杂度 | 平均性能 | 说明 |
|---|---|---|---|
| Shell 原始(÷2) | $ O(n^2) $ | 较差 | 当相邻元素分布在不同组时效率低,易退化 |
| Knuth | $ O(n^{1.5}) $ | 中等偏上 | 结构合理,适合教学与一般用途 |
| Hibbard | $ O(n^{3/2}) $ | 较好 | 理论保障较好,避免部分退化情况 |
| Sedgewick | $ O(n^{4/3}) $ | 很好 | 实验性能优秀,适合高性能需求场景 |
| Ciura(经验) | 未知(但非常快) | 极佳 | 当前公认最快的实用序列 |
⚠️ 注意:所有增量序列都必须保证最后一个增量为 1,以确保最终进行一次完整的插入排序,使数组完全有序。
defshell_sort_knuth(arr):n=len(arr)# 生成 Knuth 增量序列:(3^k - 1)/2 < ngap=1while(3*gap+1)<n:gap=3*gap+1# 得到最大的小于 n 的 Knuth 数whilegap>=1:foriinrange(gap,n):temp=arr[i]j=iwhilej>=gapandarr[j-gap]>temp:arr[j]=arr[j-gap]j-=gap arr[j]=temp gap//=3# 回退到前一个 Knuth 数returnarr