目标:
快速排序
彩笔是单色笔的效率的300倍,单色要记录、整理、再整理(排序)
归并排序
注意这个部分(图1)是让大家看分解部分,省略的代码部分利用的在学顺序表和链表那部分的合并两个数组的内容,使用时就因是p1 = left, p2 = div+1,里面的条件也变,开辟的数组怎么存下去呢,就是函数声明里的tmp在发挥作用,我个人觉得其实应该还有个int* cur,来代替内部去声明cur,用这个来标记tmp中下标游走的位置,当如果我们转念在原数组int* a上操作,那么就可以省略tmp,应为我们的区间划分下a1和a2是不重叠的,这个情况下tmp就来当cur了,不对,这样会导致数据丢失的(下面的情况就是让数据3丢失了),那么应该是还是不能省掉开辟数组,这里取巧的地方因该是cur = left,所有才不用额外弄一个int* cur来标记了,即left的值传递,就伴随表达了cur的始值;额外的还有,在这个合并内容的最后一步要把a的值被有序化的tmp进行对应的区域覆盖,这个部分我觉得才是处理的“合并”的部分了,即图2表达的部分。
(图1)
(图2)
注意div后面调用左边是用div,右边使用div+1
注意这里的基础有部分是前面学的字符相关的库函数
合并数组
归并的非递归实现
右边的那个情况,我们称之为“修边界”,这里的基本要素上上面给到的MergeArr,后面我们用它来组合使用了修边界去实现非递归的归并算法,它的特点是抽象了两个范围,即两个区间,即四个字,让合并的操作变得灵活,从而解放我们。
讨论外排序
内存空间处理不下,而外部文件要处理排序的刚需,就分化了内排序和外排序的概念(记忆联想法)
不同的快速排序方法,第一趟的结果是不同的