
十大经典排序算法
文章平均质量分 52
学习经典排序算法,提高辩证思维能力
onlywishes
我不知道路途的前方究竟有什么,但还是迈出了步伐,我们仍在旅途之中。
展开
-
基数排序详细说明及实现-python
在第三次分桶时,十位和个位均已按顺序排序,只有百位数字无序,此时将百位置为关键字,分桶完成后,百位数字也就按照桶的顺序有序排列,所有数字位都有序,排序完成。然后再次分桶,按照十位数字分桶,因为个位从小到大有序,所以第二次每个桶中的个位还是有序的,又因为每个桶是按照从小到大排序的,所以依次输出到原序列即可。每个桶分别代表0-9这10个数字,那么对于很多数的序列这只有10个数字是如何排序的呢,其实当数字分到桶中时就完成了一次排序,0-9这10个桶就相当于间接排序了。原创 2023-01-21 21:09:57 · 271 阅读 · 0 评论 -
桶排序详细说明及实现-python
如下图,我们以序列【5, 24, 78, 65, 54, 94, 15, 36, 68, 35, 3, 78, 89, 56, 47】为例,进行桶排序。可以看到改进前桶排序用时达到了9秒多, 而快速排序用时0.3341秒,明显快排较快,而改进后的桶排序内部也采用了快速排序,结果比快排还要快为0.2383秒,所以改进是有效的且显著的。我们为了比较一下改进是否有效,比较其排序时间更直观。来记录每个函数的排序时间。由于我们用到快速排序,我们可以把我们之前写的快速排序进行一下改装,放到QuickSort.py下。原创 2023-01-18 22:53:35 · 1426 阅读 · 1 评论 -
计数排序详细说明及实现-python
每次排序要开辟一个新的空间存储每个数出现的次数,这样当待排序序列个数很少,但数的跨度非常大时,就会产生很大的空间复杂度,造成空间浪费。计数排序顾名思义,就是统计每个数出现的次数,统计完毕,从小到大依次输出那么序列就是有序的。下面以序列 [5, 3, 5, 7, 4, 3, 1, 3, 5] 九个数为例,进行说明。实现简单,时间复杂度为O(n)原创 2023-01-15 23:16:23 · 200 阅读 · 0 评论 -
希尔排序详细说明及实现-python
可以发现,每次插入排序,会把每次增量分割得到的子序列进行排序。可以快速使序列向有序方向发展。最后一次增量为1,就是执行一次常规的插入排序,遍历整个序列完成排序。因为当增量为1时,序列已基本有序,交换次数大大减小,规避了从序列末尾一直交换到序列首部等耗时操作。因此希尔排序也可以看做插入排序的一种更高效的改进版本。我们一般以序列长度的一半为增量起始值。即 n//2作为增量起始值。这里的增量的取值不固定,每一种取值方法造成的时间复杂度不一样。原创 2023-01-13 18:02:09 · 331 阅读 · 0 评论 -
归并排序详细说明及实现-python
当剩下两个序列且分别有序时,只要一次合并就可以使整个序列有序。原创 2023-01-12 17:01:32 · 502 阅读 · 0 评论 -
堆排序详细说明及实现-python
首先将与堆相应的完全二叉树根结点中的记录移出,该记录称为待调整记录。从空结点的左、右子中选出一个关键字较大的记录,如果该记录的关键字大于待调整记录的关键字,则将该记录上移至空结点中。然后看原 54 位置是否有孩子结点,若有孩子结点,让 tmp 与 孩子最大值比较,小于孩子最大值 50 ,那么把 50 放置到空位置,此时原50 位置为空。保存记录,15 与左右孩子中较大者比较,即与 54 比较,15小,把 54 置于堆顶位置,此时原 54 位置为空。,即对应的完全二叉树根结点的值是所有元素中值最小或最大的。原创 2023-01-12 00:19:25 · 630 阅读 · 0 评论 -
快速排序实现及思路-python
直到最后left指针和right指针重合,即该空位左边的数都小于tmp,空位右边的数都大于tmp,把tmp置于空位上本次排序结束,获得tmp的位置,进行分治,从下标0到tmp下标-1的位置上和tmp下标+1到列表最后继续重复递归上述过程。最后整个列表即为有序。在第一次排序时,首先选定无序列表的最左边的值为tmp保存,然后从列表最右边向左边取值与tmp比较,若tmp小于等于该值,就继续向左比较,直到一个数小于tmp,就把该数放到左边指针指向的空位上。原创 2023-01-10 21:46:32 · 186 阅读 · 0 评论 -
插入排序-python
若tmp大于前一个数字那就将tmp插入其后面,本次插入结束,开始抽取下一个数字进行比较插入;若tmp小于前一个数字那就将前一个数字后移一位,tmp继续向前比较,直到前面无数字就插入第一个位置,本次插入结束,开始抽取下一个数字。针对无序列表,我们从第一个数开始,向后续列表逐个抽取数字,每抽取一个数字就保存该数字为tmp,然后逐个与前面的数字进行比较。以此类推,直到抽取完最后一个数字,插入完毕即为有序。直到抽取完列表最后一个数字插入结束,排序完成。原创 2023-01-09 19:43:47 · 96 阅读 · 0 评论 -
递归与非递归实现选择排序-python
设置第一个元素为最小值,遍历后续列表与设置的最小值比较,若小于最小值就将min_loc置于其位置,一轮就会找到一个最小值位置min_loc,放到第一个位置,第一轮结束。因为最后两个元素只需要比较一次,所以n个元素共循环比较n-1轮。考虑每次循环完一轮就从下一个位置开始,从下一个位置进行递归,判断一下若当前开始循环位置不是最后一个位置就继续,否则结束递归。针对无序列表元素,每次让列表中最小的元素依次从最前面往后放,最后肯定是有序的。排序过程如图所示:每一趟确定一个位置的元素。原创 2023-01-08 20:30:35 · 347 阅读 · 0 评论 -
递归与非递归冒泡排序-python
列表中每两个相邻的数,如果前面比后面大,则交换这两个数,由于最后两个数只需要比较一次,n个数共需要比较n-1次即可确定一个数,剩下m个数需要比较m-1次确定一个数,即n-1-1次。非递归每完成一次循环就确定一个最大数,不在参与循环比较,那么可以利用这个特性进行递归调用,每次递归列表长度-1.上面这种冒泡排序会把循环执行完毕,即最坏的情况,到最后整个列表才有序,但是时间复杂度是。每次比较完一趟后得到一个固定的数,不在参与排序。,可以进行优化,一旦列表有序就不在循环,直接返回结果。排序过程如图所示,共8趟。原创 2023-01-07 18:35:20 · 729 阅读 · 0 评论