八大排序算法之二希尔排序(C语言)
来源:互联网 发布:java实现九九乘法表 编辑:程序博客网 时间:2024/06/10 07:17
希尔排序是一种插入排序法,它出自D.L.Shell,因此而得名。Shell排序又称作缩小增量排序。
基本思想:
不断把待排序的对象分成若干个小组,对同一小组内的对象采用直接插入法排序,当完成了所有对象都分在一个组内的排序后,排序过程结束。每次比较指定间距的两个数据项,若左边的值小于右边的值,则交换它们的位置。间距d按给定公式减少: di+1 =(di +1)/2 ,直到d等于1为止。D可以选取{9,5,3,2,1}。
操作方法:
- 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
- 按增量序列个数k,对序列进行k 趟排序;
- 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
希尔排序的示例:
算法步骤:
Step1 将n个元素个数列分为5个小组,在每个小组内按直接插入法排序;
step2 在第i步,分组个数取 di+1 =(di +1)/2 {9,5,3,2,1};相临两组之间的对应元素进行比较,如果ai>aj,则交换它们的位置;
Step3 当dK = 1的循环过程完成后,排序过程结束。
希尔排序举例:设有字符数列"f d a c b e",执行Shell排序:
SHELL排序算法的描述:
算法讨论:
Shell排序算法的时间复杂度分析比较复杂,实际所需的时间取决于各次排序时增量的个数和增量的取值。研究证明,若增量的取值比较合理,Shell排序算法的时间复杂度约为O(n(ldn)2)。由于Shell排序算法是按增量分组进行的排序,所以Shell排序算法是一种不稳定的排序算法。
=====================================My code=====================================
- #include<iostream>
- using namespace std;
- void shell(int *work,int n)
- {
- int i,j,x,d;
- d= n / 2;
- while (d>=1)
- {
- for (i=d+1;i<=n;i++)
- {
- x=work[i];
- j=i-d;
- while ((j>0) && (x<work[j]))
- {
- work[j+d]=work[j];
- j-=d;
- }
- work[j+d]=x;
- }
- d /= 2;
- }
- }
- int main(){
- int a[100],b,c,n,i;
- cout<<"请输入需排序的数字个数:";
- cin>>n;
- cout<<"请输入需排序的数字";
- for (i=1;i<=n;i++)
- {
- cin>>a[i];
- }
- shell(a,n);
- cout<<"从小到大排序结果为:";
- for (i=1;i<=n;i++)
- {
- cout<<a[i]<<' ';
- }
- system("pause");
- }
0 0
- 八大排序算法之二希尔排序(C语言)
- 八大排序算法之(二)插入排序 希尔排序
- 八大排序算法(二)希尔排序
- 八大排序算法 之 希尔排序(缩小增量排序)
- C语言--------排序算法---------希尔排序(二)
- 八大排序算法之希尔排序
- 八大排序算法之希尔排序
- Java八大排序算法之希尔排序
- 排序之二:希尔排序(C语言实现)
- 排序算法之希尔排序(C语言实现)
- 八大排序算法(2) 希尔排序
- 算法导论 之 希尔排序[C语言]
- 八大排序算法-希尔排序
- 八大种必知排序算法(二) 选择排序,插入排序,希尔算法(续)
- 八大种必知排序算法(二) 选择排序,插入排序,希尔算法
- 八大排序算法之直接插入排序和希尔排序
- 八大排序之希尔排序
- 八大排序之希尔排序
- 创建ApiDemo示例
- Android 内存溢出解决方案(OOM) 整理总结
- 项目测试管理杂谈
- 组播解惑
- infinispan配置
- 八大排序算法之二希尔排序(C语言)
- 提升ListView的运行效率
- Oracle db 11.2.0.4 linux 6.3下编译bbed
- Android 浏览器打开本地app
- POJ 2481 Cows
- IOS调试—断点调试以及动态输出
- 【Thinking In Java笔记】多态
- javaWEB项目定时调用
- android之官方下拉刷新组件SwipeRefreshLayout