![](https://img.haomeiwen.com/i7171153/d32273441366413a.png)
直接插入排序
基本思想:
将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。
要点:设立哨兵,作为临时存储和判断数组边界之用。
![](https://img.haomeiwen.com/i7171153/9afdd9a338c801f5.png)
![](https://img.haomeiwen.com/i7171153/d60e7b7384808372.png)
选择排序
在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。
![](https://img.haomeiwen.com/i7171153/c011f16a2ba8e8a3.png)
![](https://img.haomeiwen.com/i7171153/69808d056aaf512e.png)
![](https://img.haomeiwen.com/i7171153/fb199d020bf7826e.png)
堆排序
以最大堆为例
以数组建堆
父节点必定比他的子节点小
父节点下标为i,则子节点下标为2i+1和2i+2
step1:建堆,假设长度为length
从最后一个有孩子节点(length-1)/2的节点开始,往下做堆调整操作;之后再-1往前一个节点重复该操作
![](https://img.haomeiwen.com/i7171153/b45a4d5e1c9d0d9f.png)
如上图a,我们现在num[3]节点进行调整,即97,找出他的子节点较小的一个进行交换,49和97交换,继续从往下调整,直到数组结束或者该节点小于他的子节点,
重复操作直到建堆完毕。
step2:排序
每次将堆底元素和堆顶元素进行对换,然后对新的对顶元素重新进行渗透堆调整,数组长度-1;重复操作,直到排序完毕,此时数组呈倒序排列
代码:
![](https://img.haomeiwen.com/i7171153/eb7601538b3bdcbd.png)
![](https://img.haomeiwen.com/i7171153/d8b350eaa5965c46.png)
冒泡排序
基本思想:
在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
![](https://img.haomeiwen.com/i7171153/370068efc5afe077.png)
![](https://img.haomeiwen.com/i7171153/a63f693a653c45cc.png)
快速排序
用分治思想来解决问题
![](https://img.haomeiwen.com/i7171153/79a8d3653f50b743.png)
![](https://img.haomeiwen.com/i7171153/ab65edbc741df6db.png)
优化:可以对元素小于等8的可以采取选择排序
网友评论