循环不变量原理
第一次看到循环不变量是在算法导论的快排里。一般是针对数组问题求解,需要2个指针。
快排
快排最核心的思想是分区,也就是将给定数组分成2部分,左边比区间点小,右边比区间点大。使用循环不变量原理,以快排为例,指针 i, j 将数组分为3个部分。
其中 0 < i <= j ; i<= j < len(arr);
对所有 x < i 的元素,都有 a[x] < a[i];
对所有 i < x < j 的元素,都有 a[i] < a[x] < a[j] ;
接下来只要遍历数组,保证在遍历过程中,始终满足上述条件。
如果不满足,就通过交换来达到满足。
int partition(int *arr, int start, int end)
{
int i = start-1;
int j = start;
int base = arr[end]; //基准值
for (; j < end; ++j) {
//不满足循环不变量的原理,需要交换,保证不变量成立
if (arr[j] <= base) {
i++;
swap(&arr[i], &arr[j]);
}
}
swap(