插入排序的改进2:希尔排序
来源:互联网 发布:sql没有商业智能项目 编辑:程序博客网 时间:2024/06/05 10:51
希尔排序,也叫递减增量排序,是插入排序的一种更高效的改进版本。希尔排序是不稳定的排序算法。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
- 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率
- 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位
希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了(此时插入排序较快)。
假设有一个很小的数据在一个已按升序排好序的数组的末端。如果用复杂度为O(n^2)的排序(冒泡排序或直接插入排序),可能会进行n次的比较和交换才能将该数据移至正确位置。而希尔排序会用较大的步长移动数据,所以小数据只需进行少数比较和交换即可到正确位置。
希尔排序的代码如下:
#include <stdio.h>
// 交换函数
void swap (int a[], int i, int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
// 打印数组
void printA (int *a, int len)
{
int i;
for (i = 0; i < len; i++)
{
printf ("%4d", a[i]);
}
printf ("\n");
}
// 希尔排序
int main1()
{
int a[10] = {9,6,8,0,3,5,2,4,7,1};
int len = sizeof(a) / sizeof(a[0]);
int i,j,get;
int d = len; // d代表每一次的步长
do
{
d = d / 3 + 1;
for (i = d; i < len; i++)
{
get = a[i];
j = i - d;
while (j >= 0 && a[j] > get)
{
a[j+d] = a[j];
j -= d;
}
a[j+d] = get;
}
}while (d > 1);
printA (a, len);
return 0;
}
int main()
{
int a[10] = {9,6,8,0,3,5,2,4,7,1};
int len = sizeof(a) / sizeof(a[0]);
int i,j,get;
int d = 0; // d代表每一次的步长
while (d < len)
{
d = d * 3 + 1; // 0 1 4 13
}
while (d >= 1)
{
for (i = d; i < len; i++)
{
get = a[i];
j = i - d;
while (j >= 0 && a[j] > get)
{
a[j+d] = a[j];
j -= d;
}
a[j+d] = get;
}
d = (d-1) / 3; // 4 1 0
}
printA (a, len);
return 0;
}
- 插入排序的改进2:希尔排序
- 改进的希尔排序
- 希尔排序(插入排序的改进)C++实现
- 直接插入排序到希尔排序做的那些改进
- 2希尔排序-直接插入排序改进版
- 插入排序高效改进之希尔排序
- 改进排序算法:希尔排序(对直接插入排序的改进)
- 算法<改进的冒泡排序、直接插入排序、折半插入排序、希尔排序、快速排序、归并排序>
- 希尔排序(shell排序)的详细解说,对插入排序算法的改进
- java关于插入排序—希尔排序的理解,以及冒泡排序的改进
- 几种常见的排序算法(插入排序,希尔排序,归并排序和快速排序),算法分析以及改进
- 排序 - 插入排序 [2 - 希尔排序]
- 排序(二)插入排序、插入改进——二分插入排序、插入改进——希尔排序
- 插入排序--希尔排序
- 插入排序 希尔排序
- 插入排序--希尔排序
- 插入排序,希尔排序
- 插入排序:希尔排序
- java虚拟机类加载器
- mysql-python安装出错
- @media-屏幕窗口变化时理解
- shell变量测试
- 51单片机定时器
- 插入排序的改进2:希尔排序
- 线程同步示例
- Springmvc通过注解解决日期转换问题
- Spring MVC使用FreeMarker调用java静态方法
- 机器学习在有限规则可选之下的可能性
- 堆操作(优先队列)
- 理解 SolrCloud
- java des 加解密 通用版
- 时间控制