「这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战」
排序
常见的排序算法
image-20211119082822804
常见排序算法的实现
选择排序 最慢排序(最好理解)所以搬血
基本思想:
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。
直接选择排序
在元素集合array[i]–array[n-1]中选择关键码最大(小)的数据元素
若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换
在剩余的array[i]–array[n-2](array[i+1]–array[n-1])集合中,重复上述步骤,直到集合剩余1个元素
image-20211120195032904
上面那个就是选择排序的本质,但是一次就选一个最大或者最小是不是有点浪费,我们一次同时选到最大最小,就是会比传统的选择排序快一倍
我们基本看到上面代码的缺陷就是我们第一个就是最大是时候,最大的就被换走了,而最小的就被换过来了,但是最大的下标还是标记首位置,把最小的换到后面,也就出现了最小的1在后面的现象
解决方法:既然你最大数的下标和begin重合,那最大数被换走的时候,maxi这个下标也要连带着走
image-20211120233139638
实际上下面 才是我第一次写的代码,直接说下次我再也不写装逼的交换了
image-20211120235444317
我来道bug恶心之处 看好了跳跳 5 ^ 5 0 这就是恶心之处,下次再也不装逼了==
数据交换 剥离出来其他函数也会用到 我明明是简洁之人为了一时的高级而忘记了朴素罪过罪过
1 | c复制代码//数据交换 |
选择排序
1 | c复制代码// 选择排序 |
时间复杂度是O(N^2^) 我们的优化不是质的优化,而是量的优化
最好:O(N^2^)
最坏:O(N^2^)
堆排序
堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是
通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。
image-20211121094727004
向下调整函数
1 | c复制代码//向下调整函数 |
堆排序代码
1 | c复制代码// 堆排序 我们之前讲过升序建大堆 |
堆排序时间复杂度O(N*logN)
测性能 让你看看什么叫堆
这里我们测性能就用release版本测吧 因为release版本是程序最优状态,每个排序都是最好状态,巅峰打巅峰
1000大小数组 一千
image-20211121113727817
10000大小数组 一万
image-20211121114331200
100000大小数组 十万
image-20211121114552970
1000000大小数组 一百万
image-20211121125949374
10000000大小数组 一千万 我们不带选择,插入玩太拉跨了,我们看看希尔,堆在超大数据面前谁性能更优
image-20211121130941961
性能函数图
image-20211121133907018
代码
Sort.h
1 | C复制代码#pragma once |
Sort.c
1 | c复制代码#define _CRT_SECURE_NO_WARNINGS 1 |
test.c
1 | c复制代码#define _CRT_SECURE_NO_WARNINGS 1 |
本文转载自: 掘金