排序的概念
外部排序很难,后面都是内部排序
插入排序
直接插入排序
理解
这个排序第一轮是从第二个元素开始的
然后是从后往前一个一个比的
然后我们看i=5的情况,会出现比较次数和移动次数的概念,这里97动了
然后i=8时,49最好放在相同的后面,这样就可以稳定了
这个算法会有n-1趟
然后第n趟会有n+1个有序,比如第二趟i=3时会有3个元素有序
这是最坏情况,可以看见第一趟移动和比较都是1次,第二趟2次,第三趟3次
也就是这么多次移动和比较
折半插入排序
理解
前面不是已经是有序的吗,所以用折半多爽啊
直接是从后往前比,而折半是折半查找比,这里查找顺序是65,49,38
题目
d
希尔排序
理解
下面增量d=5
然后每组之间排序
也可以直接竖着写,这样更快
然后是增量为3
然后竖着写,这样更快,结果:
那增量怎么取?
没错,最后一个是增量是d=1就行
这就是传说中的
链表不太行啊
题目
1
2
我们先看d=3行不行
一会升序一会降序,所以不是3
然后看d=5可以发现每一组都是有序的,而且必须每一组都是有序的,所以一定要竖着写下来
然后根据第一趟看第二趟的就行了
d
交换排序
冒泡排序
理解
怎么去做呢,看好了
49 和 27 比,小的在上,大的在下,很好,过
27 和 13 比,小的在上,大的在下,很好,过
13 和 76 比,小的在下,大的在上,不好,交换!
。。。就这样一直比下去就行,就是1轮
第一轮比较了n-1次,并且13已经确定好了
第二轮比较了n-2次,并且27已经确定好了
。。。
然后会有这个规律
然后注意
最好情况就比较了1次
快速排序
理解
这是规矩
快排的目的是小的放左边,大的放右边
这里6作为枢轴(pivot),从7往左比较
然后比较一下7,没问题,是大于6的,太好了,很舒服,不错,继续保持,加油
然后比较一下4,wait,wait,wait,what the HELLLLL!WAAZZZAAAA!是小于6的
然后会发生很多事情
4先到枢轴上去,6往后找比它大的,找到了9
然后把9放到4那里,9的地方就存储6
然后神奇的事情发生了,6变成了我们想要的样子,左边小于6,右边大于6,6这个位置已经确定了
然后就是算法大师最喜欢的分治法
左右两边都处理是第二趟,左右两边都进行快排
先看左边
,这里4是枢轴,然后从5开始往右
5没事
1有事,小于4,先把1到枢轴,然后枢轴的指针往后移动开始找比它大的数,最后发现与右指针相遇,于是只能把4放到那里
再看右边
这里8是枢轴,然后从7开始往右
7有事,小于8,先把7到枢轴,然后枢轴的指针往后移动开始找比它大的数,发现个9,9到7那里,8插入到里面来
然后不用第三趟了,因为左右两边就1个元素
然后每次会有logn趟,每趟是n
所以时间复杂度Onlogn
最差情况下是有序的情况,时间复杂度达到On^2
比如这里,1要找比它小的,找了n-1次,没找到,向右的指针会到1这里,1确定了,然后枢轴指针往后移动变成2,再来一次,找了n-2次,就这样,当然别固化死了,这里枢轴不一定要是第一个,也可以是中间的4,但说到底只有一个枢轴。
链表还是不行
做题
1
d 不解释
2
这里是枢轴产生的三种情况,可以注意到d选项,
12如果是第一趟的枢轴,那应该左右两边都有才对,然而并不是左右,这里只有一个32
然后我们看看A选项
这里我们那72当第一趟,那28作为下一趟就合理了
3
这里,最少最少得有2个枢轴,而C选项只有1个9
B选项是9和2是枢轴
c