2026/4/6 6:02:50
网站建设
项目流程
怎么自己制作一个网站,我想做网站怎么做,wordpress codecolorer,长沙网络营销首选智投未来并非希儿排序#xff08;#xff09;其实是分组的插入排序#xff0c;通过分组让元素实现跳跃式移动#xff0c;减少逆序对数量。一、算法步骤1. 确定增量序列#xff08;Gap Sequence#xff09;选择递减的增量序列#xff1a;gap₁ gap₂ ... gapₖ 1…并非希儿排序其实是分组的插入排序通过分组让元素实现跳跃式移动减少逆序对数量。一、算法步骤1.确定增量序列Gap Sequence选择递减的增量序列gap₁ gap₂ ... gapₖ 1常用增量序列Shell原始序列gap n/2, n/4, ..., 1Hibbard序列2ᵏ - 11, 3, 7, 15, ...Knuth序列3k 11, 4, 13, 40, ...Sedgewick序列更复杂的优化序列2.分组插入排序对于每个增量gap将数组分为gap个子序列每个子序列由相隔gap的元素组成对每个子序列进行插入排序3.逐步缩小增量每次减少gap重复分组排序直到gap 1执行最后一次标准的插入排序代码class Solution { public: vectorint sortArray(vectorint nums) { int n nums.size(); for(int gap n 1; gap; gap 1){ for(int i gap;i n; i){ int j i - gap; int x nums[i]; while(j 0 x nums[j]){ nums[j gap] nums[j]; j - gap; } nums[j gap] x; } } return nums; } };二、所用到的思想希尔排序虽然不是典型的分治算法如归并、快排但它巧妙地运用了分治的核心思想1.分解Dividefor(int gap n 1; gap; gap 1)分解方式按照gap值将原数组分解成多个子序列分解粒度从n/2开始每次减半直到1子序列特点当gap4时分解为4个子序列子序列1nums[0], nums[4], nums[8], ...子序列2nums[1], nums[5], nums[9], ...子序列3nums[2], nums[6], nums[10], ...子序列4nums[3], nums[7], nums[11], ...每个子序列元素间隔为gap2.解决Conquerfor(int i gap; i n; i) { int j i - gap; int x nums[i]; while(j 0 x nums[j]) { nums[j gap] nums[j]; j - gap; } nums[j gap] x; }独立解决对每个子序列独立进行插入排序局部有序每个子序列内部变得有序关键特性子序列之间不互相干扰当处理nums[i]时只与同子序列的前一个元素nums[i-gap]比较子序列之间的元素不直接比较3.合并Combine希尔排序的合并是隐式的无需显式合并因为排序是原地进行的渐进合并随着gap减小子序列逐渐融合最终合并当gap1时所有元素在同一个子序列中完成最终排序。三、希尔排序分治思想的优势1.空间效率原地排序不需要归并排序的额外数组空间复杂度O(1)2.时间效率早期的大gap快速消除远处逆序对后期的小gap精细调整局部顺序比直接对整个数组做插入排序高效得多