找最值
每次确定一个最值位置,找最值,就是一个全局遍历过程,
交换找最大值,中间可能有序
对比找最大值,必须全部找出
交换找最大值,保留中间状态
bubble 对比交换,遍历0-i可以确定第i+1位置,最值
1,最外层循环是从len-1-->1,i是要确定最值需要的下标
2,二层是0-->i,相邻交换,确定i+1是最值
3,二层无交换,有序可退出
相邻交换不会相等交换,稳定
select 通过对比找出最值,填位置
1,最外层循环0-->n-1是准备要填的位置i,
2,二层是i+1-->n-1找出比i更小的下标min
3,min有比i更小,交换填i
跨越交换,破坏相邻相等,不稳定
heap 对比找出最值,但是结构保留了部分对比结果,父子大小关系
1,建堆,从第一个非叶子节点开始调整,一直到根节点。(选择排序保留对比结果)
每次调整都会以当前根节点开始,遍历最大子节点,一直调整到叶子节点
时间复杂度k=log(n),k为堆的层数
2,根节点交换出来
3,调整堆顶
跨越交换不稳定
找位置
insert 根据值在已有序列找自己位置
1,准备插入的数据,1-->len-1
2,向前比较,i-1-->0,大于后移,直到空出位置
3,填空位置
后面来了一个特别小的元素,需要全部移动,那么排序的效率特别低
shell 插入的找到空位置条件是基本有序,进行预处理,对后面排序是有很大效果的
优点是如果在数组最后加入一个小元素,他会被很快移到最前面
1,tap = len/2,tap /= 2
2,准备插入的数据,tap-->len-1
3,向前比较,tap间隔,大于后移,直到空出位置
4,填空位置
merge 合并并不耗时,时间为O(n),每个小段复杂度减少,2T[n/2],分治到1个数据
需要空间合并,减少时间
1,二分打散到两个组,直到1个数据,有序
2,两个有序组合,left-->mid,mid+1-->right,取值排序到一个新的空间
3,排序赋值到原数组
quick 找任一个数据,找到其对应位置,并且以此分界,存储了部分对比结果
1,left-->right,确定第一个数据的pivot
2,right--,left++,直到相等,left < right 执行交换
(从右开始,相等会是小于,最后交换值会是小于)
3,left=right=pivot和第一个数据交换
3,以pivot为界,left-->pivot-1,pivot+1-->right,递归