C语言如何实现交换排序算法


这篇文章主要介绍了C语言如何实现交换排序算法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言如何实现交换排序算法文章都会有所收获,下面我们一起来看看吧。对于很多同学来说冒泡排序是再熟悉不过了,冒泡的思想在于:不断的比较两个元素并交换,大的在右边,小的在左边;有一个数组{5, 1, 4, 2, 8, 4}第一轮arr[0] = 5和 arr[1] = 1比较 5 > 1,交换;arr[2] = 4和 arr[1] = 5比较 5 > 4,交换;arr[2] = 5和 arr[3] = 2比较 5 > 2,交换;arr[3] = 5和 arr[4] = 8比较 5 arr[4] = 8和 arr[5免费云主机域名] = 4比较 8 > 4,交换;第二轮从arr[1]开始重复上述的步骤;… …直到循环 N – 1 次,排序结束;那么问题来了,问题一:这里我们发现对于这个数组而言在第二轮排序就已经排好了整体甚至稳定的有序,剩下的循环就相当于浪费了,那么有没有一种方法能够判断数组已经有序?还有这样一个数组{4, 2, 1, 5, 6, 8}问题二:我们发现{5, 6, 8}的部分是已经有序了的,对于已经有序的部分还要继续比较,那么能不能确定出有序的部分和无序的部分的边界呢?针对问题一,我们可以添加一个标志,用来标识数组是否有序:当某一轮排序没有发生交换,就可以认为数组已经有序了;针对问题二,我们可以记录冒泡排序的过程中最后一次发生交换的地方index,如在下图中index==1,每一次后面的排序只要从第一个到index就可以了;值得注意的是,不管怎样去优化,最坏情况的时间复杂度都是O(n^2),即数组逆序的情况;虽然用栈实现冒泡排序可能在实际中没有应用场景(也没必要用),但是可能会有面试的时候要求用栈或者其他的结构去实现冒泡排序来考查对算法和思想熟练度,所以这里也提供用栈实现冒泡排序的思路;选取一个基准(可以认为是要放到排序以后正确的位置的元素,可以是第一个元素、最后一个 中间的、随机的都可以);把数组中的元素做一个划分,每一趟划分将作为基准的值x放到排序后数组正确的位置,并将所有比x小的放到左边,比x大的放到右边;有一个数组{1, 8, 3, 9, 4, 5, 4, 7}假定选择元素arr[7] = 7为基准,就是要把7放在正确的位置,那么只有两种情况:要么7本身就是正确的位置,要么就在前面;第一步:初始化指针 i = -1,j = 0,把 j 指向的元素和7比较 ,当1
第二步:把 j 指向的元素和7比较 ,当8 > 7,将 j++;第三步:把 j 指向的元素和7比较 ,当3
第四步:把 j 指向的元素和7比较 ,当4
第五步:把 j 指向的元素和7比较 ,当5
第五步:把 j 指向的元素和7比较 ,当4
第六步:当j到7遍历结束,让i++的位置和7交换,第一趟排序结束;如此一来,基准7就找到了它在数组中的正确位置,并且把数组划分成了两边【0,5)和(5,7】这时再选一个基准再进行上述步骤,如下图所示:是不是觉得很眼熟?没错这就是一棵二叉树:既然是二叉树,那么排出一棵斜树自然就是最坏的情况;要缓解这个问题,可以以中间的值为基准来减少这种情况的发生;即复杂度与数组长度和基准的选择有关,尾基准是O(n^2)因为n趟每一趟划分需要O(n),而平衡树是O(nlogn),通过数学方法能够得到更优的基准选择,但无论选什么为基准都应该能满足:基准左边小、右边大;我们之前说过,快速排序其实是一个不稳定排序(不稳定的排序就意味着交换的次数多,如果需要按多条件排序就会乱),而我们又说过任何一个不稳定的排序算法都有办法使其变得稳定,用到的是以空间换时间的思想;也就是我们可以用一个变量对原来的顺序做标记;既然是通过不断划分数组来减少比较的次数,这一听就知道用到了分治的思想,也就是可以用递归来实现代码:运行结果关于“C语言如何实现交换排序算法”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“C语言如何实现交换排序算法”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注百云主机行业资讯频道。

相关推荐: css如何实现吃豆豆加载动画效果

本文小编为大家详细介绍“css如何实现吃豆豆加载动画效果”,内容详细,步骤清晰,细节处理妥当,希望这篇“css如何实现吃豆豆加载动画效果”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。豆豆加载效果point_down:html代码:p…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/19 18:17
下一篇 03/19 18:17

相关推荐