当两个数组按顺序排列时,适当的位置排序?

时间:2011-01-12 22:57:59

标签: algorithm sorting in-place

I am working on this question。我的函数原型是

static void Sort(byte[] arr, int leftPos, int rightPos)

在函数的第二部分我知道leftPos到leftPos +(rightPos-leftPos)/ 2和(rightPos-leftPos)/ 2到rightPos按顺序排序。

我试着思考如何在适当的位置排序,知道这两个部分是有序的。我什么都想不到。我查看了merge sort上的合并函数,但它使用的是输出数组而不是就地。

如何知道这两个切片是否正常排序?

注意:我想我可以传入一个与主数组长度相同的额外数组作为临时内存,但我想到的方法需要我在每次合并后执行Array.Copy。

1 个答案:

答案 0 :(得分:1)

就地合并是可能的,但它很复杂,并没有带来太多的性能提升。以下是here的一些示例代码。 fromleftPostorightPospivot是你的(rightPos-leftPos)/2,长度是每半的长度。

void merge(int from, int pivot, int to, int len1, int len2) {
  if (len1 == 0 || len2==0) return;
  if (len1+len2 == 2) {
   if (compare(pivot, from) < 0)
    exchange(pivot, from);
   return;
  }
  int first_cut, second_cut;
  int len11, len22;
  if (len1 > len2) {
   len11=len1/2;
   first_cut = from + len11;
   second_cut = lower(pivot, to, first_cut);
   len22 = second_cut - pivot;
  } else {
   len22 = len2/2;
   second_cut = pivot + len22;
   first_cut = upper(from, pivot, second_cut);
   len11=first_cut - from;
  }
  rotate(first_cut, pivot, second_cut);
  int new_mid=first_cut+len22;
  merge(from, first_cut, new_mid, len11, len22);
  merge(new_mid, second_cut, to, len1 - len11, len2 - len22);
}