首页 > 其他分享 >希尔排序(详讲)

希尔排序(详讲)

时间:2024-05-29 11:31:49浏览次数:17  
标签:详讲 end 插入排序 arr gap 希尔 排序 间隔

目录

个人评价

原理

希尔排序分为两步

例如

间隔大小

时间复杂度

代码


个人评价

一个很天才的想法,对插入排序进行一点更改,代码很简略但是非常的快

和堆排序可以坐在一张桌上

原理

一般的插入排序都是以1为单位进行比较

越有序,插入排序越快

希尔排序就是一个使数组不断趋近有序的排序,和插入排序有异曲同工之妙

希尔排序是一种间隔的排序

希尔排序分为两步

1.预排序

2.插入排序

例如

以3为间隔

可以分成三组

对每组都单独进行插入排序,这样就可以以很小的代价使数组趋向有序,插入排序也就越快

我们不断缩小间隔,可以使数组不断趋近有序,插排也就越快

间隔大小

插排的间隔并没有明确答案,但是一般间隔

gap=sum/3+1

gap=gap/3+1

这样做可以保证最后gap为1,而且间隔大小是随数组大小变化而变化

但是学校里上课一般gap=sum/2,gap=gap/2

时间复杂度

非常复杂,对于绝大部分人来说完全无法计算

例如

一开始间隔100,分为3组

我们假设一开始就是最差情况,那么需要排序100*(1+2)=300

但是从第二组开始

直接乱掉了

因为第二组开始就没法保证是最差情况了,因为第一组时就已经排过序了,打乱间隔也没法确保就是最差情况

对于我这计算水平来说肯定是算不出来的

但是根据大量数据可以得出

希尔排序的时间复杂度大概为

O(N^1.3)

比起冒泡,插排等等排序要快上许多,可以和复杂度为O(NlogN)的堆排序进行比较

代码

void shellsort(int* arr, int sum) {
	int gap=sum, begin, end, tmp,i;
	while (gap > 1) {
		gap = gap / 3 + 1;
		for (begin = 0; begin < gap; begin++) {
			for (i = begin; i < sum - gap; i += gap) {
				end = i;
				tmp = arr[i + gap];
				while (end >= 0) {
					if (arr[end] > tmp) {
						arr[end + gap] = arr[end];
						end -= gap;
					}
					else
						break;
				}
				arr[end + gap] = tmp;
			}
		}
	}
}

标签:详讲,end,插入排序,arr,gap,希尔,排序,间隔
From: https://blog.csdn.net/z202331720425/article/details/139290131

相关文章

  • 二分查找算法详讲(三种版本写法)原创
    介绍:二分查找算法(BinarySearch)是一种在有序数组中查找目标元素的算法。它的基本思想是通过将目标元素与数组的中间元素进行比较,从而将搜索范围缩小一半。如果目标元素等于中间元素,则搜索结束;如果目标元素小于中间元素,则继续在左半部分查找;如果目标元素大于中间元素,则在右......
  • 【LeetCode算法】第83题:删除排序链表中的重复元素
    目录一、题目描述二、初次解答三、官方解法四、总结一、题目描述二、初次解答1.思路:双指针法,只需遍历一遍。使用low指向前面的元素,high用于查找low后面与low不同内容的节点。将具有不同内容的节点链接在low后面,实现重复元素的删除。2.代码:/***Definitionfor......
  • 八大基础排序
    八大基础排序1.冒泡排序(BubbleSort)基本思想:依次比较相邻的两个元素,若它们的顺序错误则进行交换。特点:稳定排序,但效率较低,时间复杂度为O(n^2),空间复杂度为O(1)。代码实例publicclassBubbleSortExample{publicstaticvoidmain(String[]args){//示......
  • 数据结构的直接插入排序(C语言版)
    一.直接插入排序的基本概念1.直接插入排序的基本思想将数组分为已排序和未排序两部分。每次从未排序部分取出一个元素,将其插入到已排序部分的合适位置,使得已排序部分保持有序。重复步骤2,直到整个数组有序。2.排序的工作原理假设前i-1个元素已经有序,现在要将......
  • 选择排序.原理讲解
    背景一天,老师要李小明把10000个同学的成绩从高到底排序。李小明蒙了:“这么大,我不行呀!”正文啊,哈喽,小伙伴们大家好。我是#张亿,今天呐,学的是选择排序.原理讲解这就像我们排队是从高到矮一样,将同一类型的数据按一定顺序(从大到小或从小到大)排列称为排序。排序的算法有很多,其......
  • MySQL按指定顺序排序(order by field的使用)
    新建t表CREATETABLE`t`(`id`intNOTNULLAUTO_INCREMENT,`c`intDEFAULTNULL,`name`varchar(255)COLLATEutf8mb4_general_ciNOTNULLDEFAULT'',PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_general_ci;存......
  • 排序(冒泡、选择、插入、希尔、归并、快速)
    冒泡排序基本原理冒泡排序(英语:BubbleSort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。voidBubble_Sort(int*num,intnumesize){for(inti=0;i<numesize;++i){......
  • 【算法】合并k个已排序的链表
    ✨题目链接:NC51合并k个已排序的链表✨题目描述 合并k 个升序的链表并将结果作为一个升序的链表返回其头节点。数据范围:节点总数 0≤......
  • NOI模拟 排序幻觉
    涉及知识点:二进制,贪心题意给一个数组\(a[1],a[2],\ldots,a[n]\),选择一个数\(b\),如果\(b\)满足:\[(a[1]\oplusb)\leq(a[2]\oplusb)\leq\ldots\leq(a[n]\oplusb)\]则称\(b\)是数组\(a\)的幻数。有\(q\)次询问,每次永久修改一个数。对于原数组与每次询问后......
  • 七大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、归并排序、快速排序
    以下内容转载自文章1.插入排序步骤:1.从第一个元素开始,该元素可以认为已经被排序2.取下一个元素tem,从已排序的元素序列从后往前扫描3.如果该元素大于tem,则将该元素移到下一位4.重复步骤3,直到找到已排序元素中小于等于tem的元素5.tem插入到该元素的后面,如果已排序所有元......