插入排序——直接插入和希尔
来源:互联网 发布:戒色吧为什么不封 知乎 编辑:程序博客网 时间:2024/06/11 00:21
插入排序主要包括 直接插入和希尔排序
直接插入排序: 稳定,时间复杂度O(n^2)
从第二个元素开始,将后面的数据依次插入到前面有序的队列中
void derectinsert(int data[], int len)
{
int i =1;
for(; i < len; i++)
{
int value = data[i];
int j=i-1;
while(j >= 0 && value < data[j])
{
data[j+1] = data[j];
j--;
}
data[j+1] = value;
}
}
以上算法也可以在最前面插入一个哨兵,让他的值等于value,这样就可以不用判断 j>=0了;另外,因为前面的数据已经是有序的了,所以在插入的时候可以采用折半查找,这样可以提高速度,为O(n*logn)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
希尔排序:不稳定,时间复杂度 平均时间 O(nlogn) 最差时间O(n^s) 1<s<2,一般认为是O(n^1.3)
它的算法不是每次一个元素挨一个元素的比较。而是初期选用大跨步(增量较大)间隔比较,使记录跳跃式接近它的排序位置;然后增量缩小;最后增量为 1 ,这样记录移动次数大大减少,提高了排序效率。希尔排序对增量序列的选择没有严格规定。
①先取一个正整数 d1(d 1 <;n) ,把全部记录分成 d1个组,所有距离为 d1的倍数的记录看成一组,然后在各组内进行插入排序;
②然后取 d2( d2 < d1 ) 。
③重复上述分组和排序操作;直到取 di=1(i>=1) ,即所有记录成为一个组为止。一般选 d1约为 n/2 , d2为 d 1 /2 , d3为 d 2 /2 ,…, d i =1 。
void shellsort(int data[], int len)
{
int d = len/2;
while(d>0)
{
int k = 0;
for(; k < d; k++)
{
int i = k+d;
for(; i < len; i+=d)
{
int value = data[i];
int j=i-d;
while(j >= 0 && value < data[j])
{
data[j+d] = data[j];
j-=d;
}
data[j+d] = value;
}
}
d = d/2;
}
注:当 d = 1的时候就是一个直接插入排序
- 插入排序——直接插入排序和希尔排序
- 插入排序——直接插入和希尔
- 插入排序(直接 和 希尔)
- 算法——直接插入和希尔排序
- 插入排序——直接插入排序和希尔排序,C++代码实现
- 直接插入排序和希尔排序
- java直接插入排序和希尔排序
- 直接插入排序和希尔排序
- 直接插入排序和希尔排序
- 直接插入排序和希尔排序
- 直接插入排序和希尔排序
- 直接插入排序和希尔排序
- 直接插入排序和希尔排序
- 【直接插入排序】和【希尔排序】
- 直接插入排序和希尔排序
- 数据结构排序--直接插入和希尔排序
- 排序算法——插入排序(直接插入排序、折半插入排序、希尔排序)
- 插入排序:直接插入排序和希尔排序
- 为何要选择iOS开发而不选择其它的平台?
- (莱昂氏unix源代码分析导读-5) 中断与陷入初探
- 利用人性弱点的互联网服务
- sharedUserId和签名
- QT3连接SQLite及使用方法
- 插入排序——直接插入和希尔
- [iOS] performSelector:withObject:afterDelay:调用没有作用的问题及解决方法
- 为了方便移植而对系统函数进行封装
- C++ 虚函数表解析
- Iphone开发(四)文本框,文本视图,和软键盘的隐藏
- Android NDK文档之 Android NDK CPU 功能侦测库
- js正则表达式验证有效性
- vs2008编译boost_1_48
- Advanced Memory Allocation