最近的思维发生了变化,具体可以参考之前我发过的一篇小分享。
大致思维是,通过状态机的想法建立代码的几何意义,multi-dimension的,不局限于3-D。
如今的想法受到了一些学习材料的影响。
我还是以quick-sort举例
将算法视为一种代数运算,根据我们定义的运算。
为什么要去递归的不断的去降低整体的无序性?不妨视为一种运算。
以下将元素element简称为E,Ea代表元素a,E可以是一个集合。
Ea <= Eb 当Ea这个集合中的所有值都<= Eb,于是有 Ea <= Eb 成立。
因为是有序的比较,a和b一定是连续的元素。
我们定义的这个运算是封闭的。
比如 5 1 4 2 3 当 1 是有序的 则一定有 E(1) <= E(2,3,4,5)成立
那么这个想法就非常自然了,我们只需要让每个元素满足我们定义的这个运算,注意,是每一个。
E(1),E(2),E(3) 甚至 E(1,2) E(2,3) 这些运算都是满足要求的。
这个想法有什么用呢
许多纠结的问题将不再是问题
void quick_sort(int a[],int l,int r)
{
//我们的函数要完成的运算是什么呢 函数当然是用来完成运算的
//保证 新的两个元素的相对有序 即E(a) <= E(b)
int x = a[l + r >> 1]
int i = l - 1, j = r + 1;
while(i < j)
{
//为什么是a[i]小于x?因为E(a) <= E(b)
//只有这样才能保证两个状态可以维持我们这个运算的合法性
do(i++) ;while(a[i] < x)
do(j--) ; while(a[j] > x)
//省略
}
quick_sort(a,l,j); //形成两个新的E
quick_sort(a,j+1,r);
// 分界点是双指针,双指针的左侧和右侧的元素满足E(a) <= E(b)
// 因为我们的运算是基于双指针的遍历进行的
/*
这里的分界 相当于 r = mid, l = mid + 1;
*/
}
下一篇分析如何用这种想法引导我们做分治时候的边界判断