快速排序帮助,不确定为什么分区返回索引而不是数组

时间:2011-05-09 05:17:43

标签: partitioning quicksort

我想知道是否有人可以帮我快速排序。我理解分区的一般想法,但不确定为什么它会返回索引

int partition(int arr[], int left, int right)
{
      int i = left, j = right;
      int tmp;
      int pivot = arr[(left + right) / 2];

      while (i <= j) {
            while (arr[i] < pivot)
                  i++;
            while (arr[j] > pivot)
                  j--;
            if (i <= j) {
                  tmp = arr[i];
                  arr[i] = arr[j];
                  arr[j] = tmp;
                  i++;
                  j--;
            }
      }

      return i;
}

void quickSort(int arr[], int left, int right) {
      int index = partition(arr, left, right);
      if (left < index - 1)
            quickSort(arr, left, index - 1);
      if (index < right)
            quickSort(arr, index, right);
}

我理解整个重新排列的部分。这对我来说很有意义,但我不确定为什么分区只返回一个索引。我以为它应该返回一个阵列?就像问题是......排序{1,12,5,26,7,14,3,7,2}。我以为会回来......

1,2,5,7,3,14,7,26,12

我猜这就是为什么我不了解实际的快速排序功能。但如果有人能够以一种易于理解的方式帮助解释清楚,那将非常感激。非常感谢!

2 个答案:

答案 0 :(得分:2)

返回的索引仅用于识别QuickSort算法中的recurrsion结束。它主要是用于识别越来越小的数字的枢轴元素的索引。

AND:您指的是增强的快速搜索算法。在QuickSearch算法的基本版本中,不需要返回的索引。

它也适用于:(但速度慢很多)

void quickSort(int arr[], int left, int right) 
{
      if (left < right)
      {
         int index = partition(arr, left, right);
         quickSort(arr, left, index - 1);
         quickSort(arr, index+1, right);
      } 
}

答案 1 :(得分:1)

您的分区功能正在就地修改阵列。它返回的整数是一个索引,在该索引之前,值小于pivot,并且从值开始大于pivot。两个递归调用是对较小元素和较大元素进行排序;在递归调用之前测试的条件作为基本情况。