Shell排序?Shell排序是大量数据需要排序时,更为高效的插入排序。它的算法思想基于插入排序的算法思想流程:(1)将n个元素数组分成n/2个数字序列,第一个数据和第n/2个数据为一对,等等,以此类推(2)一次循环...
Shell排序
?
Shell排序是大量数据需要排序时,更为高效的插入排序。它的算法思想基于插入排序的算法思想
流程:
(1)将n个元素数组分成n/2个数字序列,第一个数据和第n/2个数据为一对,等等,以此类推
(2)一次循环使每一个数对排列好顺序
(3)变成n/4个数对,再次排序。
(4)不断重复上述过程,随着序列减少直至最后变为1个,完成排序。
具体如何怎么排的可以运行代码查看每一步排序。
?
?
#include<iostream>
#include<cstdlib>
#include<ctime>
using?namespace?std;
void?ShellSort(int?*a,int?len)
{
????int?x,t,j;
????for?(int?r?=?len/2;?r?>=1?;?r/=2)????//外层循环分组
????{
????????for?(int?i?=?r;?i?<?len;?i++)????
????????{//内层循环设置一定间距r,分别比较对应元素,当r=1时,这个时候就为插入排序,数组元素数量大时这时效率比插入排序高。
????????????t=a[i];
????????????j=i-r;
????????????while?(j>=0&&t<a[j])
????????????{
????????????????a[j+r]=a[j];
????????????????j-=r;
????????????}
????????????a[j+r]=t;
????????????x++;
????????????cout<<"Sort?result?after?"<<x<<"?step";??????????????//输出每一步排序结果
????????????for?(int?k?=?0;?k?<?len;?k++)?cout<<a[k]<<"?";
????????????cout<<endl;
????????}
????????
????}
????
}
int?main()
{
????srand(time(NULL));
????int?n;
????cout<<"Please?cin?the?size?of?array:"<<endl;?//输入数组的大小
????cin>>n;
????int?a[n];
????cout<<"Array?before?sorting:"<<endl;
????for?(int?i?=?0;?i?<?n;?i++)????????????//利用随机数作为数组输入
????{
????????a[i]=rand()/1000;
????????cout<<a[i]<<"?";
????}
????cout<<endl;
????ShellSort(a,10);
????cout<<"Array?after?sorting:"<<endl;??//输出排序后的数组
????for?(int?i?=?0;?i?<?10;?i++)?cout<<a[i]<<"?";
????cout<<endl;
????return?0;?
????
}
沃梦达教程
本文标题为:Shell排序 C&&C++
基础教程推荐
猜你喜欢
- C语言的三种条件判断语句你都了解吗 2023-03-05
- 05-C语言进阶——动态内存管理 2023-11-20
- VisualStudio2010安装教程 2023-01-05
- g++: const 丢弃限定符 2022-10-07
- C语言数组长度的计算方法实例总结(sizeof与strlen) 2023-04-26
- Qt数据库应用之实现通用数据库请求 2023-03-18
- character-encoding – Linux中最常见的C语言编码(和Unix?) 2023-11-21
- C语言植物大战数据结构二叉树递归 2023-04-09
- 纯C++代码详解二叉树相关操作 2023-05-15
- 利用QT设计秒表功能 2023-05-30
