注册 登录
编程论坛 C语言论坛

数组下标和赋值的奇特问题(洛谷快速排序模板题卡了)

Divine 发布于 2021-02-18 19:36, 1386 次点击
先上代码比较
程序代码:
#include<iostream>
using namespace std;
int arr[1000001],n;
void quicksort(int left,int right)
{
   
    int i=left;
    int j=right;
    int pivot=(left+right)/2;
    do
    {
        while(arr[i]<arr[pivot])
          i++;
         
        while(arr[j]>arr[pivot])
          j--;
        
        if(i<=j)
        {
            swap(arr[i],arr[j]);
            i++;
            j--;
        }
    }while(i<=j);
    if(left<j)
      quicksort(left,j);
    if(i<right)
      quicksort(i,right);
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
      cin>>arr[i];
   
    quicksort(1,n);
    for(int i=1;i<=n;i++)
      cout<<arr[i]<<" ";
    return 0;
}

这是40分的,wa了三个点
程序代码:
#include<iostream>
using namespace std;
int arr[1000001],n;
void quicksort(int left,int right)
{
   
    int i=left;
    int j=right;
    int pivot=arr[(left+right)/2];
    do
    {
        while(arr[i]<pivot)
          i++;
         
        while(arr[j]>pivot)
          j--;
        
        if(i<=j)
        {
            swap(arr[i],arr[j]);
            i++;
            j--;
        }
    }while(i<=j);
    if(left<j)
      quicksort(left,j);
    if(i<right)
      quicksort(i,right);
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
      cin>>arr[i];
   
    quicksort(1,n);
    for(int i=1;i<=n;i++)
      cout<<arr[i]<<" ";
    return 0;
}

这是ac的代码


比较发现是直接int pivot=arr[(left+right)/2];

先int pivot=(left+right)/2;再while(arr[i]<arr[pivot]),也就是放数组中的区别。

麻烦帮我看一下为什么?谢谢
1 回复
#2
请输入密码2021-02-18 20:52
第一个:swap后,可能会改变arr[pivot]的值。
第二个:pivot的值却不会被改变。
1