问题一:
给定一个数组arr,和一个数num,请把小于num的数放到数组arr数组的左边,把大于num的数放到数组的右边。
问题二:(荷兰国旗问题)
依然是给定一个数组arr,和一个数num,请把小于num的数放到数组arr数组的左边,把等于num的放在数组的中间,把大于num的数放到数组的右边
问题一
解:
假设num是5
1.准备一个变量表示小于等于区域的右边界,来到i后会有两种情况,第一种是小于等于num,第二种是大于等于num的。
第一种情况[i]<num [i]和<=区域下一个做交换,<=区右扩一位置 , i++
第二种情况 ,i++
问题二:
解:
1)[i]<num [i]和小于区域下一个做交换,<区域右扩,i++
2)[i]=num ,i++
3)[i]>num,[i]和大于区域前一个做交换,>区左扩,i原地不变
快排1.0
先在最右边开始选一个数,假如取5那么5就放到<=5的右边界,小于区域就换成<=5,如果下一个数是<=5的就继续放,并以下一个数继续做边界。
如果这个数>5,那么就把它放到>5的区域下一个数还是>5的,那么就以下一个数作为边界。
快排2.0
堆
完全二叉树
这就不是完全二叉树了
堆首先是完全二叉树,其次堆分为大根堆和小根堆
大根堆
在这个二叉树里,每一个子树的最大值就是头节点的值
小根堆
在这个二叉树里,每一个子树的最小值就是头节点的值
如此反反复复的循环下去
今天主要就学了这个算法