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

2023-12-13 17:29:26

引言

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

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

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

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

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

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

他们开始按照希尔排序的原理 :对扑克牌进行排序。首先,他们把牌按照一定的增量分成几个小堆,然后对每个小堆进行插入排序。随着增量的逐渐减少,他们不断地对小堆进行插入排序,直到增量变为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;
}



文章来源:https://blog.csdn.net/xiaov_sen/article/details/134808798
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。