数据结构算法-希尔排序算法

本文讲述了小明和小森如何利用希尔排序算法对混乱的扑克牌进行排序,通过实践学习了算法的魅力,提升了解决问题的能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

在一个普通的下午,小明和小森决定一起玩“谁是老板”的扑克牌游戏。这次他们玩的可不仅仅是娱乐,更是要用扑克牌来决定谁是真正的“大老板”。

然而,小明的牌就像刚从乱麻中取出来的那样,毫无头绪。小森的牌也像是被小丑掷出的,毫无规律可言。看着手中的牌,他们陷入了深深的思考。

就在他们即将放弃的时候,小明灵光一现:“我们可以使用希尔排序来对扑克牌进行排序!”

小森一脸困惑地问:“希尔排序?那是什么鬼?”

小明解释道:“希尔排序是一种基于插入排序的算法,可以把乱序的数组变得有序。我们可以通过逐渐减少增量序列的方式,让扑克牌的局部变得有序。”

听到这个解释,小森瞬间兴奋起来:“那就让我们开始吧!”

他们开始按照希尔排序的原理 :对扑克牌进行排序。首先,他们把牌按照一定的增量分成几个小堆,然后对每个小堆进行插入排序。随着增量的逐渐减少,他们不断地对小堆进行插入排序,直到增量变为1。在这个过程中,他们不断地比较牌的大小,进行交换。最后,整个序列都变得有序了。

经过一番努力,小明和小森终于将扑克牌排好序了。在接下来的“谁是老板”游戏中,他们凭借着已经排好序的扑克牌,一路高歌猛进,最终获得了胜利!

小森高兴地说:“希尔排序真是太神奇了!我们以后可以多使用它来对扑克牌进行排序!”

小明也笑着说:“是啊,而且我们可以把扑克牌当作数字来练习我们的数学能力!”

在这个欢声笑语的下午,小明和小森不仅学会了使用希尔排序来对扑克牌进行排序,还体验到了算法的魅力。他们明白了一个道理:只要肯努力,总会找到解决问题的方法!

希尔排序算法核心思路

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述希尔排序 先将待排序序列按照一定的间隔分成若干个子序列,对这些子序列进行插入排序。然后缩小间隔,再次进行插入排序。不断重复这个过程,直到最后的间隔为1,此时整个序列已经基本有序了,再进行一次插入排序即可完成排序。

希尔排序算法专区

// ShellSort是一个函数,接受一个整数数组arr,数组的大小size,以及一个比较函数comp作为参数  
void  ShellSort(int arr[], int size, bool (*comp)(const int&, const int&)) {  
  
    // 初始化gap为数组长度的一半,这是希尔排序的经典起始距离  
    for (int  gap = size/2; gap>0; gap/=2){  
  
        // 遍历从gap位置开始到数组末尾的每一个元素  
        for (int  i = gap; i < size; i++){  
  
            // 保存当前元素的值  
            int value = arr[i];  
  
            // 从当前元素位置开始向前遍历,每次移动gap的位置  
            int j = i - gap;  
            // 只要前一个元素大于当前元素(满足comp函数的条件),就继续向前移动  
            for (;j>=0 &&comp(arr[j],value); j-=gap){  
  
                // 向前移动gap的位置,将前一个元素向后移动  
                arr[j + gap] = arr[j];  
  
            }  
  
            // 在正确的位置插入当前元素  
            arr[j + gap] = value;  
        }  
  
    }  
}


// 定义一个名为GreaterCmp的函数,它接受两个const int&类型的参数val1和val2,返回值为bool类型。当val1大于val2时返回true,否则返回false。  
bool GreaterCmp(const int& val1, const int& val2) {
	return val1 > val2;
}

// 定义一个名为LessCmp的函数,它接受两个const int&类型的参数val1和val2,返回值为bool类型。当val1小于val2时返回true,否则返回false。  
bool LessCmp(const int& val1, const int& val2) {
	return val1 < val2;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小森程序员

若能帮助到你,小费自愿付费

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值