六种排序算法--主要思想以及实现

冒泡排序

冒泡排序比较简单,相信知道思想自己就能写出代码。
思路:根据数组长度决定遍历的次数,每次遍历就找出这次遍历的最大值或者最小值,那么就排好序了。这时候写出的代码是可以优化的,我们从思想中可以看出来,只要某一次遍历,数组元素根本没有进行交换,那么就已经排好序了,直接退出就好。
在这里插入图片描述

选择排序

其实选择排序也是比较简单的,所谓选择就是满足我要求的就放置在合适的位置上。比如说我升序排列,在每一次遍历的时候,不进行位置的交换,我只对最小值所在位置的记录,等到遍历完这一次,那么这就是我想要的最小值。当然遍历次数也是数组的长度减一
在这里插入图片描述

插入排序

插入排序思想挺奇妙的,一个数组看为有序表和无序表通过移位来将有序表填充。这里用的是移位而不是以前常用的交换,当然交换也能做,只是需要的操作需要多一点。
在这里插入图片描述

希尔排序

对于希尔排序其实就是插入排序的优化,因为如果存在前面100个数都是有序的最后一个数是最小的,那么利用插入排序就需要做很多无意义的循环,为了减少这些循环,希尔排序就被提出了。
主要思想还是简单的,首先将数组分为其长度一半个分组(加入分为了五组那么0,5,10…就是一组的),然后遍历这些分组对这些分组中的元素进行移位操作。这样做即使为了让小的数聚集在一边,大的数聚集在一边。然后较小分组,每次都将分组减小一倍,这样。直到最后一个分组,在进行插入排序就完成了排序
在这里插入图片描述

快速排序

主要思想:初始化一个基准数以及两个指针,一个指向数组尾部,一个指向数组头部。然后对这个这个数组进行遍历,如果在右边指针发现比基准数小的值退出循环,开始启动左边的指针循环遍历看是否出现有比基准数大的值,如果有就退出循环进行交换。总会出现一次两个指针相遇,相遇就退出循环,让base的值与这个两个指针相遇位置换位。然后以当前位置划分为两块区域,进行上述相似操作。

先解释为什么能排好序,你看其实每次选出来的数就是其该有的位置,不管其左边的数有没有排好序,都知道左边的数是小于这个值的,所以其位置就是该在这里。

在这里插入图片描述
这个快速排序还是挺好玩的,想法很奇妙!

归并排序

总所周知归并算法是分而治之的思想,其实就是将每一阶段得到的结果进行组合,得到的就是正确的结果集。

主要思想:借助额外空间,首先对分组数组进行遍历,因为处理的是分割数组的左右两边的指针对应值,所以遍历数组的两个指针的对应值,通过比较值的大小进行,加入到额外数组,加完后,将遍历这个额外数组将对应下标和对应值进行修改。这样就完成这个分组的排序。当变为两个分组时,这时左边是升序,右边也是升序,按照上述操作进行排序到额外数组以及对原有数组进行改变,就变成了一个有序数组。

首先将该数组进行分组,利用左指针和右指针算中间值,然后根据中间值进行分割,直到左指针和右指针相等返回。返回后,就开始进行以该分组开始排序。

分组:
在这里插入图片描述
排列数组
在这里插入图片描述

堆排序

关于堆排序,首先还是要知道堆这个结构其实就是类似于完全二叉树的一种数据结构,只不过所存储的数据不再仅限于从小到大,除了值的规定不一样外堆还是遵循完全二叉树的特点的。

大顶堆:即父节点是大于子节点。
小顶堆:父节点小于子节点。

首先要知道几个特性其实就是完全二叉树的特性,这里使用数组来表示n = arr.length/2 -1。左子节点下标lfson=(n<<1)+1,右子节点rtson=(n<<1)+2。n为父节点的在数组的下标。
原理:根据堆这一数据结构选出每次最大值,与参与本次排序的最后一个节点交换位置,交换后堆会进行重构,当又成为一个堆后再次把第一个元素拿出来与最后一个元素交换,直到只剩下最后一个值。

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值