我试图使用循环不变量(使用初始化,维护和终止方法)来确定算法是否正确,以及为它获取断言和后置条件。我有一些东西,但我不确定它是否正确接近它,因为算法中任何一点的某个值的输出存在不确定性(mid取决于arr [sweep]
int partition(int arr[], int first, int last) {
int mid = first;
int pivot = arr[first];
for (int sweep = first+1; sweep <= last; sweep++) {
// Assertion: . . .
if (arr[sweep] < pivot) {
int tmp = arr[sweep];
arr[sweep] = arr[mid+1];
arr[mid+1] = tmp;
mid++;
}
}
// Post: . . .
arr[first] = arr[mid];
arr[mid] = pivot;
return mid;
}
我设法想出了这个:
I:
首先= 0
最后=长度-1
中= 0
L:
在循环开始时,我现在是i + 1
首先= 0
最后=长度-1
Sweep = first + 2
中= i +(第一)= i(其中我的值取决于arr [sweep]
Sweep = Last + 1
Mid =(last + 1)+(first)=(last + 1)+(0)= Last + 1(如果所有值都是arr [sweep]
//断言:在每个循环之前mid = first + i其中i是arr [sweep]的次数
//后置条件:arr [first..mid-1]将小于arr [mid], arr [mid + 1 ... last]&gt; ARR [MID]。 Sweep = last + 1.
我是新的循环不变量,我希望我能正确地做到这一点。任何建议都会非常有用。 :)