C ++ - 快速排序 - 自定义实现不起作用

时间:2015-10-27 07:11:02

标签: c++ qsort

我的代码:

void quickSort(int array[], int last)
{
    int middle = last / 2;
    int i = 0, j = last;
    while(i <= j)
    {
        while(array[i] < array[middle])
            i++;
        while(array[j] > array[middle])
            j--;

        if(i <= j)
        {
            swap(array[i], array[j]);
            i++;
            j--;
        }
    }

    if(j > 0)
        quickSort(array, j);
    if(last > i)
        quickSort(array + i, last - i);
}

int main()
{
    int a[] = {10,9,8,7,6,100,5,4,3,2,1};
    quickSort(a, 10);
    return 0;
}

如果完成,我会在内存中看到下一个值:

{1, 6, 7, 8, 9, 10, 2, 3, 4, 5, 100}

我无法意识到我做对了什么。这段代码实际上是从某些来源复制和粘贴的,但我的修改输出的值不正确。

怎么了?

3 个答案:

答案 0 :(得分:1)

您应该在每次迭代期间存储您的轴。你现在写它的方式可以在你继续通过数组时进行变异。在第一次迭代中,选择100作为枢轴,然后用j交换,然后1成为枢轴。这可能发生在你的所有迭代中。

答案 1 :(得分:0)

如果您需要,可以使用此功能:

void quicksort(int x[],int first,int last){
    int pivot,j,temp,i;

     if(first<last){
         pivot=first;
         i=first;
         j=last;

         while(i<j){
             while(x[i]<=x[pivot]&&i<last)
                 i++;
             while(x[j]>x[pivot])
                 j--;
             if(i<j){
                 temp=x[i];
                  x[i]=x[j];
                  x[j]=temp;
             }
         }

         temp=x[pivot];
         x[pivot]=x[j];
         x[j]=temp;
         quicksort(x,first,j-1);
         quicksort(x,j+1,last);

    }
}

像这样调用这个函数

int main(){
  int a[] = {10,9,8,7,6,100,5,4,3,2,1};

  quicksort(a,0,10);

  printf("Sorted elements: ");
  for(i=0;i<11;i++)
    printf(" %d",a[i]);

  return 0;
}

答案 2 :(得分:0)

    void qsort(int arr[], int fst, int last)
    {
        int i, j, pivot, tmp;
        if (fst<last)
        {
            pivot = fst;
            i = fst;
            j = last;
            while (i<j)
            {
                while (arr[i] <= arr[pivot] && i<last)
                    i++;
                while (arr[j]>arr[pivot])
                    j--;
                if (i<j)
                {
                    tmp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = tmp;
                }
            }
            tmp = arr[pivot];
            arr[pivot] = arr[j];
            arr[j] = tmp;
            qsort(arr, fst, j - 1);
            qsort(arr, j + 1, last);
        }
    }

以下是代码中的问题 -

如果(i <= j)条件,则递增i并且递减j不是必需的并且如果不需要(j <0)条件并且还不需要(last> i)条件。< / p>