微信做模板下载网站中信建设有限责任公司 乔峰手机
news/
2025/10/4 11:08:21/
文章来源:
微信做模板下载网站,中信建设有限责任公司 乔峰手机,公关公司,腾讯云域名备案需要提供网站建设方案书基本思想希尔排序#xff08;Shells Sort#xff09;#xff0c;以发明人命名#xff0c;又称为缩小增量排序#xff0c;也是一种插入排序算法。主要思想#xff1a;直接插入排序算法时间和待排数据有关#xff0c;其平均复杂度是O(n^2)#xff0c;但是在待排数据已经有…基本思想希尔排序Shells Sort以发明人命名又称为缩小增量排序也是一种插入排序算法。主要思想直接插入排序算法时间和待排数据有关其平均复杂度是O(n^2)但是在待排数据已经有序的情况下其复杂度可以达到O(n)因为不需要移动数据。希尔排序就是利用这种特点先将整个待排数据记录分割成若干个子待排数据记录然后分别进行直接插入排序当整个待排数据记录“基本有序”时再对整个数据记录进行完整的一次直接插入排序。通俗地来说先“跳着”给待排序列排序几个数据让待排数据基本有序的情况再直接插入排序。举例来说例如给定10个整数(4,3,1,2,6,5,0,9,8,7) 从小到大排序。第一步假定先分成五个子序列请注意增量分割例如第1个元素和第6个元素是一个子序列第2个元素和第7个元素是一个子序列。最终分成 (4,5)(3,0)(1,9)(2,8)(6,7)对子序列分别排序最终得到结果(4,0,1,2,6,5,3,9,8,7)调整了(3,0)的位置。第二步分成三个子序列缩小增量因此第1个元素和第4个元素、第7个元素、第10个元素是一个子序列。最终分成(4,2,3,7)(0,6,9)(1,5,8)同样对子序列的数据进行排序得到结果(2,3,4,7)(0,6,9)(1,5,8)最终得到(2,0,1,3,6,5,4,9,8,7)第三步分成一个子序列也就是增量为1此时和直接插入排序一样对整个序列进行直接插入排序即可。算法有效的特征时使用增量分割序列时有可能会让“乱序”的数据“跳跃到”前面这样不用移动位置从而减少移动的次数。希尔排序算法时间复杂度分析是个复杂的难题其针对每个队列的所选的增量序列不同时间不同。增量序列的值应满足没有除1以外的公因子并且最后一个增量值为1例如......11,9,5,3,2,1等。代码实现希尔排序与直接插入排序相比1.需要进行多次子排序过程每次子排序也是直接插入排序。2.需要一个增量序列分割整个待排序列。/*
#include stdio.h// 对分割每个子序列进行排序
// dk比较子序列增量
void shell_insert(int a[], int length, int dk)
{int i,j,t;for(idk; ilength; i){if(a[i] a[i-dk] ){t a[i];for(ji-dk; j0 t a[j]; jj-dk)a[jdk] a[j];a[jdk] t;}}
}void shell_insert_sort(int a[], int length, int dk[], int dk_length)
{int i;for(i0; idk_length; i){shell_insert(a, length, dk[i]);}
}
int main(void)
{int a[10] {4,3,1,2,6,5,0,9,8,7};int dk[3] {5,3,1};shell_insert_sort(a,10,dk,3);int i;for(i0; i10; i)printf(%d , a[i]);return 0;
}
其实做为一个学习者有一个学习的氛围跟一个交流圈子特别重要这里我推荐一个C/C基础交流583650410不管你是小白还是转行人士欢迎入驻大家一起交流成长。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/927061.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!