堆排序
堆排序
堆排序需要先建堆后向上/向下调整来升序或者降序。
建小堆/建大堆,选出了最小的/最大的,首尾交换,最小的/最大的放到最后的位置把最后一个数据,不看做堆里面的,向下调整就可以选出次小的/次大的。
无序数组 4,7,1,9,3,6,5,8,3,2,0
建大堆 0 ,2, 1,3,3,6,5,8,9,7,4
降序: 9,8,7,6, 5, 4,3,3,2,1,0
希尔排序
间隔gap为一组,总共gap组 假设gap==3
插入排序
数组 1 2 3 4 5 6 7 8 插入9 和插入0
hoare排序
让key 在数组左边,设置了数组左边left 和右边right,left往左边走找到比key大,right往右边走 找到比key小,当left 和right找到对应的数字后进行交换,当走到相遇时让key和left right的数字进行交换这个key的位置也发生了改变。
多趟排序就是在原有的基础在进行分割,递归新的left 和right key
1 左边做key,右边先走;保障了相遇位置的值比key小
2 右边做key,左边先走;保障了相遇位置的值比key大
左边做key,右边先走;保障了相遇位置的值比key小
L和R相遇)无非就是两种情况,L遇R和R遇L
情况一:L遇R,R是停下来,L在走,R先走,R停下来的位置一定比key小相遇的位置就是R停下的位置,就一定比key要小
情况二:R遇L,在相遇这一轮,L就没动,R在移动,跟L相遇,相遇位置就是L的位置,L的位置就是key的位置 or 交换过一些轮次,相遇L位置一定比key小
每次选key都是中位数,效率就很好。数组有序,变成最坏,时间复杂度是O(N^2)
三数取中
头尾中间取不是最小和最大
hoare排序非递归:用到了栈的思想,不是递归但在逻辑上用到了递归
每次从栈里面拿出一段区间单趟分割处理左右子区间入栈
挖洞法的示意图
前后指针法
归并递归思想;整个数组除以2分为2个数组,新的数组再除以2再分出数组,直到变为单个数字再一一进行排序,后面就层层合并,合并成所需数组。
归并非递归
gap是每组的数据个数,11 22 44 归并
归并的时候会越界,处理办法:归并一组拷贝一组也可以整体拷贝。
选择排序 数组 7,89,31,27,93,100,1,3