希尔排序介绍

原理

基本概念:希尔排序的基本原理是将相距一定增量的数据组成多个子序列,分别进行插入排序,这有利于消除相隔较远的元素之间的逆序关系。

增量缩减:随着算法的进行,增量逐渐减少,子序列的长度增加,整个数组趋向于完全有序。

步骤

选择增量:开始时选择一个较大的增量值,通常是数组长度的一半或者一半的一半。

子序列排序:对每个子序列执行插入排序。

缩小增量:逐步减小增量,重复上述排序过程。

完成排序:当增量减小到1时,整个数组完成排序。

性能分析

希尔排序的效率依赖于增量序列的选择,最坏情况下的时间复杂度约为O(n^2),但实际运行时间通常比直接插入排序要好,大约可达到O(n ^ 1.3)。

稳定性

不稳定,意味着在排序过程中可能会改变相等元素的相对顺序。

适用性

由于其间隔交换的特性,其适合用于数据间隔较大的情况。

代码

c 复制代码
#include <iostream>

using namespace std;

void shellSort(int *arr,int len){
	//int len=sizeof(arr)/sizeof(int); 这样写是有问题的? 
	/*
	在 C++ 中,当你将数组作为参数传递给函数时,实际上传递的是指向数组的指针,
	而不是整个数组的大小信息。因此,在函数内部,无法使用 sizeof(arr) 来获取数组的长度,
	因为 arr 只是一个指向数组首元素的指针。(8个字节,算出来结果是2)
	
	*/
    int intervel=len/2;
    for(;intervel>0;intervel=intervel/2){    //不断缩小增量 
    
    	for(int i=intervel;i<len;i++){  //对每个合适的元素插排 
    		int idx=i-intervel;
    		int cur=arr[i];
    		while(idx>=0 && arr[idx]>cur){
    			arr[idx+intervel]=arr[idx];
    			idx-=intervel;
			}
			arr[idx+intervel]=cur;
		}
	}
	return;
} 

int main() {
    int arr[]={0,9,5,3,4,2,6,7,8,1};
	int len=sizeof(arr)/sizeof(int);
    cout<<len<<endl;
    
	shellSort(arr,len);

    for(int i=0;i<10;i++){
    	cout<<arr[i]<<" ";
	}
    
    return 0;
}

下面来看一个问题:

问:在希尔排序法中,每经过一次数据交换后

A. 能消除多个逆序

B. 只能消除一个逆序

C. 不会产生新的逆序

D. 消除的逆序个数一定比新产生的逆序个数多

答案是:

A. 能消除多个逆序

解释:

希尔排序是一种基于插入排序的算法,但与简单插入排序不同的是,希尔排序通过在初始阶段比较距离较大的元素(由增量决定)来减少移动的次数。通过这种"跳跃式"比较和交换,每一次数据交换都可以消除多个逆序(即,多个元素的错位)。由于希尔排序在数据的局部性进行较大跨度的调整,使得大的逆序可以在一次交换中得到部分甚至完全的消除。因此,这些调整往往比简单的邻元素交换更为高效,并且加速了整个排序过程。

相关推荐
半夜修仙1 小时前
分治思想对数组进行排序-归并排序
数据结构·算法·排序算法
AI人工智能+电脑小能手6 小时前
【大白话说Java面试题 第94题】【Mysql篇】第24题:什么是单路排序?什么是双路排序??
java·开发语言·数据库·mysql·面试·排序算法
方也_arkling2 天前
【Java-Day18】API篇-Arrays
java·算法·排序算法
星恒随风5 天前
C语言数据结构排序算法详解(下):冒泡排序、快速排序、归并排序和计数排序
c语言·数据结构·笔记·学习·排序算法
郝学胜-神的一滴5 天前
干货版《算法导论》07:递归视角下的选择排序与归并排序
java·数据结构·c++·python·程序人生·算法·排序算法
Dlrb12115 天前
数据结构-排序算法
数据结构·算法·排序算法·插入排序·堆排序·希尔排序·快速排序
学计算机的计算基5 天前
LeetCode刷题笔记:数组专题四连击(LC53/56/189/41)
笔记·leetcode·排序算法
Severus_black6 天前
【初阶数据结构与算法】八大排序之非比较排序(计数排序),一次性讲清!
数据结构·算法·排序算法
星恒随风6 天前
C语言数据结构排序算法详解(上):从插入排序、希尔排序到选择排序、堆排序
c语言·数据结构·笔记·学习·排序算法
过期动态6 天前
【LeetCode 热题 100】三数之和
java·数据结构·算法·leetcode·职场和发展·排序算法