划分和征服排序的正确性证明

时间:2014-09-22 00:49:32

标签: c++ algorithm correctness proof-of-correctness

假设我们有一个排序方法:

void DD_sort(int a[], int x, int y, int size_a)
{
   if(x == y){
      return;
   }
   else if(y == x+1){
      if(a[x] > a[y]){
         /* swap the content */
         return;
      }
   }
   else{
      int s = floor((y+1-x)/3);
      DD_sort(a, x, y-s, s);
      DD_sort(a, x+s, y, s);
      DD_sort(a, x, y-s, s);
   }  
}

我们可以使用哪些方法来表明排序算法正确或错误地对数组进行排序?有没有系统的方法解决这个问题?我知道它适用于size_a == 1和size_a == 2的情况,但是如果size_a是30,那么我们就会在~2/3大小的数组中递归调用排序方法。看起来好像有效,但我不确定如何正式展示。

1 个答案:

答案 0 :(得分:1)

你必须证明这些行

  DD_sort(a, x, y-s, s);
  DD_sort(a, x+s, y, s);
  DD_sort(a, x, y-s, s);

将整个数组从x到y排序,假设三个调用中的每一个都将正确排序数组的给定子集。三个调用中的最后一个确保从x到y-s的元素是有序的。第二个调用确保从y-s到y的元素是有序的。要得出结论所有元素都是有序的,你需要证明y-s到y的元素大于x到y-s的元素。

这是正确的,因为:第一次调用确保较大的s元素超出索引y-s-s> = x + s。所以第二个调用会将它们发送到数组的末尾。

如果数组的长度恰好是3 * s,则所有这些推理都是正确的。如果s小于长度的三分之一,则仍然如此,实际上如果s越小,则排序的子集越大。