首页 > 其他分享 >八大排序——希尔排序

八大排序——希尔排序

时间:2024-03-27 13:58:21浏览次数:28  
标签:arr 八大 int 插入排序 gap 希尔 排序

希尔排序算法思想

希尔排序核心思想就是:1,分组;2,直接插入排序:越有序越快
希尔排序就是多次利用直接插入排序的一个排序算法.
希尔排序的算法思想:间隔式分组,利用直接插入排序让组内有序,然后缩小分组再次排序,直到组数为1

希尔排序的理论基础就是直接插入排序越有序越快;
1.先预排序:取一个小于N的整数gap作为第一次增量,然后将距离gap的元素放入一组,再对每一组进行直接插入排序。然后将gap缩小,作为第二增量,重复以上操作。

2.再直接插入排序:当gap缩小为1时,进行直接插入排序

3.希尔排序利用了gap越大,挪动数据的距离越大,效率更高;gap越小,挪动的距离越小,前面让gap较大,可以让数据更快的挪动到自己对应的位置附近,减少挪动次数,让数据部分有序,利用直接插入排序越有序越快的特性。

 希尔排序的代码实现

//一趟希尔排序,gap为组数(间隔)
static  void  Shell(int* arr, int len, int gap)
{
	int  tmp;
	int j;
	for (int i = gap; i < len; i++)
	{
		tmp = arr[i];
		for (j = i - gap; j >= 0; j -= gap)
		{
			if (arr[j] > tmp)
			{
				arr[j + gap] = arr[j];
			}
			else
			{
				break;
			}
		}
		arr[j + gap] = tmp;
	}
}

void  ShellSort(int* arr, int len)
{
	int d[] = { 5,3,1 };//分组数,最后一个一定为1
	for (int i = 0; i < sizeof(d) / sizeof(d[0]); i++)
	{
		Shell(arr, len, d[i]);//一趟希尔排序
	}
}

希尔排序考察点:O(n1.3~n1.5),O(1),不稳定,详细见《数据结构C语言版》严蔚敏上284页.

标签:arr,八大,int,插入排序,gap,希尔,排序
From: https://blog.csdn.net/weixin_74017264/article/details/137075294

相关文章

  • 基数排序详解
    基数排序详解一、基数排序的基本概念二、基数排序的特点二、基数排序的工作过程三、基数排序的伪代码四、基数排序的C语言代码示例五、基数排序的稳定性六、基数排序的优化与变体七、基数排序的应用场景八、结论在计算机科学中,排序算法是一种非常基础和重要的算法类型......
  • 计数排序:原理、应用与性能分析
    计数排序:原理、应用与性能分析一、引言二、计数排序的基本原理三、计数排序的算法流程四、计数排序的伪代码五、计数排序的C代码示例六、计数排序的应七、计数排序的性能分析八、未来展望九、结论一、引言在计算机科学中,排序算法是一种重要的算法,它广泛应用于各种数......
  • 数据结构-排序算法(Java实现)
    1.插入排序1.1基本思想把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。1.2图解 1.3原理解析第一趟:一组数据可以分为有序序列和无序序列, i表示无序序列的第一个元素,j表示有序序列的......
  • Oracle 分页查询,排序分页
    效率最高内查询小于等于外查询大于select*from(selectt.*,rownumasnfromSTUDENTtwhererownum<=4)twheret.n>2orderbyt.iddesc;查看执行计划explainplanforselect*from(selectrownumasn,d.*fromdeptdwhererownum<=4)twheret.n>......
  • Java集合排序
    packagecom.example.demo;importjava.util.ArrayList;importjava.util.Collections;importjava.util.Comparator;importjava.util.List;publicclassTestApp{/**Comparable是一个内部比较接口,通常对象需要内部排序时直接实现Comparator是一个外......
  • 快速排序
    #include<bits/stdc++.h>usingnamespacestd;voidksort(int*a,intl,intr){intmid=a[(l+r)/2];inti=l,j=r;do{while(a[i]<mid){i++;}while(a[j]>mid){j--;}......
  • 【蓝桥杯省赛真题33】python单词排序 中小学青少年组蓝桥杯比赛 算法思维python编程省
     目录python单词排序一、题目要求1、编程实现2、输入输出二、算法分析三、程序编写四、程序说明五、运行结果六、考点分析七、 推荐资料1、蓝桥杯比赛2、考级资料3、其它资料python单词排序第十三届蓝桥杯青少年组python比赛省赛真题一、题目要求(注:input......
  • 文件按照大小排序
    文件按照大小排序OS:RedHatEnterpriseLinuxServerrelease7.9(Maipo)用的时候,经常盘就满了,得找最大的那个表,到数据库里面去查还得写sql,就干脆查文件就得了,以下是用了个空库的查询结果通过ll排序,对文件夹不够友好desc排序,并找出最大的5个[root@localhostdata......
  • Linux系列之统计某个字符串出现次数并排序
    业务场景最近遇到一个流量异常调用的接口,所以需要通过后台日志查看接口调用情况,先统计今天内接口的调用次数,再具体到对应的设备号,就知道哪台设备有问题了,初步想到wc和awk命令来筛选统计,但是真正去写的时候,发现很多写法都不太记得了,所以花了点时间去查手册,找资料,现在整理成......
  • 十大经典排序之基数排序
    文章目录概要代码实现小结概要基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。代码实现#include<stdio.h>#defi......