首页 > 其他分享 >希尔排序

希尔排序

时间:2023-02-01 10:36:54浏览次数:42  
标签:arr int 步长 gap 希尔 排序


希尔排序

希尔排序是希尔(DonaldShell)于 1959 年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含 的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。

希尔排序_算法


希尔排序_希尔排序_02


希尔排序按照步长减少排序的次数,按照步长分为不同的组,每组进行比较,然后排序,本质上还是插入排序。

一、交换法

这个交换耗费的时间比较多

具体实现如下:

//希尔排序之交换法
public static void shellsort(int [] arr)
{
//设置临时变量
int temp=0;
int count=0;
//循环设置步长
for (int gap=arr.length/2; gap>0 ;gap/=2 ) {
//从步长开始到最后
for (int i = gap; i <arr.length ; i++) {
//按照步长交换
for (int j = i-gap; j >=0 ; j-=gap) {
//如果前一个数大于gap步长的数交换
if (arr[j]>arr[j+gap])
{
//临时存储
temp=arr[j];
//交换
arr[j]=arr[j+gap];
arr[j+gap]=temp;
}
}
}
}
}

二、移动法
这种最接近插入排序,效率比较高
具体实现如下:

//希尔排序的移位法
public static void shellsort2(int [] arr)
{
//设置步长
for (int gap=arr.length/2; gap>0 ; gap/=2) {
//按照步长来分组
for (int i = gap; i <arr.length ; i++) {
//设置j的位置
int j=i;
//存储起来
int temp=arr[j];
//如果小于前面的交换
if (arr[j]<arr[j-gap])
{
//判断是否越界和是否小于前面的交换
while (j-gap>=0&&temp<arr[j-gap])
{
//交换
arr[j]=arr[j-gap];
//减掉步长
j-=gap;
}
//交换
arr[j]=temp;
}
}
}
}

希尔排序_算法_03


标签:arr,int,步长,gap,希尔,排序
From: https://blog.51cto.com/u_15949251/6030894

相关文章

  • 排序看这一篇就够了
    排序看这一篇就够了文章目录一、​​冒泡排序​​二、选择排序三、插入排序四、希尔排序五、快速排序六、归并排序七、基数排序/桶排序稳定:如果a原本在b前面,而a=......
  • 排序算法之插入排序
    思路:将数组的第一个元素作为有序数组,其余的作为无序数组,从无序数组中取一个跟有序数组比较,将其放在合适的位置。那么有序数组就有两个元素,无序数组就减少一个元素。 ......
  • 多种数组排序方法
    1.随机生成数据vara=(function(){vara=[];functionrandomInt(from,to){returnparseInt(Math.random()*(to-from+1)+from);}for......
  • 博客一号 快速排序
    从零开始的算法之路——基础算法之快速排序有了sort函数为什么还要学习其他的排序,的确也看起来比较多余(就目前来看我做的排序题都能用sort解决),但是里面算法中的思想才是......
  • Java插入排序
    下面我们创建一个java程序,实现使用插入排序对数组元素进行排序。插入排序对于小元素是有好处的,因为排序大量元素它需要更多的时间。让我们来看看一个简单的java程序,使......
  • Java选择排序
    在这个示例中,我们创建一个java程序,实现使用选择排序对数组元素进行排序。在选择排序算法中,搜索最低的元素并将其排列到适当的位置。用下一个最小的数字交换当前元素。......
  • Java气泡排序
    在教程中,将创建一个java程序,使用冒泡排序对数组元素排序。气泡排序算法也被称为最简单的排序算法。在冒泡排序算法中,数组从第一个元素遍历到最后一个元素。这里,将当前......
  • 【八大数据排序法】冒泡排序法的图形理解和案例实现 | C++
    第十四章冒泡排序法:::hljs-center目录第十四章冒泡排序法●前言●认识排序●一、冒泡排序是什么?1.简要介绍2.具体情况3.算法分析●二、案例实现1.案......
  • 搜索排序——搜索评价指标
    搜索排序一直是信息检索的研究重点,搜索排序的流程主要分为:召回层、粗排层、精排层、重排层,重排层主要考虑的是相关业务诉求和多样性要求,偏业务规则,此处我们只关注精排模型......
  • MySql中的指定顺序排序
    才发现MySQL中有个FIELD函数可以很方便的实现指定顺序排序。 语法:FIELD(value,val1,val2,val3,...)参数描述value必须。要在列表中搜索的值val1,val2,va......