常用数据算法的理解

(1)、冒泡排序

在这里插入图片描述
从第一个数开始,相邻元素两两对比,小的数放前面。(每循环一次,最后一个数都会被确定下来,为每轮的最大数)

(2)、选择排序

在这里插入图片描述
从第一个数开始,循环一圈找最小的数交换位置。(每循环一圈,第一个数都会被确定下来,为每轮最小的值)

(3)、插入排序

在这里插入图片描述

从第二个数开始,跟前一个数比较,若比前一个数小,则交换位置,接着跟前一个数比较,直到比前一个数大为止。(从第一张开始整理扑克牌,小的往前插)(可能会出现一个数从最后比较到最前面,比较费时)

(4)、希尔排序

希尔排序属于插入类排序,是将整个有序序列分割成若干个小的子序列分别进行插入排序。
排序过程:先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序,然后取d2<d1,重复上述分组和排序操作,直至d1=1,即所有记录放进一个组中排序为止。(将每间隔一定步距的数取出来进行比较,比如gap=5,就是把第1个、第6个、第11个…数取出来进行插入排序)

优点:当n值很大时,数据项每一趟排序需要移动的个数很少,但数据项的距离很长;当n值减小时,每一趟需要移动的数据增多,此时已经接近于它们排序后的最终位置。

希尔分析:

希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高。所以,希尔排序的时间复杂度会比o(n^2)好一些。

(5)、归并排序

在这里插入图片描述

归并排序有两种实现方法:自上而下的递归;自下而上的迭代。下面讲递归法:

将原数组用二分法一直分到两个数为一组,然后通过比较将较小的数放到前面(通过一个中间数组排序);然后一层层向上排序。

(就是两个数比较进行排序,然后两组(四个数)进行比较排序,然后两组(八个数)进行比较排序…)

(6)、快速排序

在这里插入图片描述
快速排序思想:先找到一个基准点(一般指数组的中部),然后数组被该基准点分为两部分,依次与该基准点数据比较,如果比它小,放左边;反之,放右边。 左右分别用一个空数组去存储比较后的数据。最后递归执行上述操作,直到数组长度<=1。

特点:快速,常用。缺点是需要另外声明两个数组,浪费了内存空间资源。

2、最快的排序算法是哪个?

快速排序时最快的排序算法。

3、手写一个冒泡排序

在这里插入图片描述

4、手写快速排序代码

在这里插入图片描述

5、快速排序的过程、时间复杂度、空间复杂度

快速排序原理:

(1)、定义一个基准元素base(我这里定义最左边的元素定位基准元素)

(2)、定义两个变量i和j

(3)、j先从右向左遍历,找到第一个比base小的数就停止。

(4)、i从左往右遍历,找到第一个比base大的数就停止。

(5)、如果i和j不相等,交换i和j指向的元素。

(6)、直到i和j指向同一元素,将这个元素与基准元素交换

(7)、递归求解

图解:
在这里插入图片描述
在这里插入图片描述

6、手写堆排序

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7、堆排序过程、时间复杂度及空间复杂度

将待排序的序列构造成一个大顶堆。此时,这个序列最大值就是堆顶的根节点。将其与数组末尾元素进行交换,此时末尾元素就是最大值,然后将剩余的n-1个序列重新构造成一个堆,这样就可以得到n-1个元素的次大值。如此反复执行,便能得到一个有序序列了。

堆排序的时间复杂度是O(n log n)

空间复杂度为O(1)

8、写出你所知道的排序算法及时空复杂度,稳定性

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值