一、 冒泡排序
1、 概念:反复扫描排序序列,且在过程中顺次比较相邻的两个元素的大小,将较小的数放在前面,大的元素放在后面。然后比较第二个数和第三个数,依旧将小数放前,大数放后,如此继续,直至比较到最后两个数。执行第二次比较,只比较前面的n-1个数字,得到次大的放在倒数第二位,以此类推,得到升序序列。
2、 时间复杂度:O(n2)
3、 空间复杂度:O(1)
4、 代码(参考他人图):
二、 直接插入排序
1、 概念:在已经被排好序的序列内,将没有被排进去的元素按照规定插入到指定的位置
2、 时间复杂度:O(n2)
3、 空间复杂度:O(1)
4、 代码(参考他人图):
三、 折半插入排序
1、 概念:前面部分是有序序列,折半查询容易定位
2、 时间复杂度:O(n2)
3、 空间复杂度:O(1)
4、 代码(参考他人图):
四、 希尔排序
1、 概念:把待排序的序列分成若干的小的子序列,然后逐个使用直接插入法排序,最后再对一个比较有序的序列进行排序,可以减少移动的次数。
2、 时间复杂度:O(n1.5)
3、 空间复杂度:O(1)
4、 代码(参考他人图):
五、 快速排序
1、 概念:以一个关键元素为轴,从左至右依次和它比较然后进行交换。在第一次结束后,把序列分为两个子序列,然后进行分段快速排序
2、 时间复杂度:O(nlogn)
3、 空间复杂度:O(logn)
4、 代码(参考他人图):
六、 堆排序
1、 概念:把待排序的元素存放在数组r[1…n]中,将r看成是一刻完全二叉树的顺序表示,每个节点表示一个记录,第一个记录r[1]作为二叉树的根,一下个记录r[2…n]依次逐层从左到右顺序排列,任意节点r[i]的左孩子是r[2i],右孩子是r[2i+1],双亲是r[i/2向下取整]。然后对这棵完全二叉树进行调整建堆。
2、 时间复杂度:O(nlogn)
3、 空间复杂度O(1)
4、 代码(参考他人图):