C__cappuccino 2018-10-27 08:35 采纳率: 0%
浏览 1788

这是一个快速排序的算法,基本情况是对的,有特殊情况没考虑到,有大哥能帮忙吗?

#include
#include
#define SWAP(x,y) {int t;t=x;x=y;y=t;}

void quicksort(int a[],int left,int right) {
//数组最左边的那个数为基数
int i,j,s;
s=a[left];
if(left while(1) {
for(i=left+1; i if(a[i]>=s) break;
}//从左往右找到第一个大于等于基数的数
for(j=right; j>=left+1; j--) {
if(a[j] }//从右往左找到第一个小于基数的数
if(i>=j) break;
/*i>=j表示右边已经都是大于基数的数,
左边都是小于基数的数*/
SWAP(a[i],a[j]);
}
SWAP(a[left],a[j]);
quicksort(a,left,j-1);
quicksort(a,j+1,right);
}
}

int main() {
int t;//t组数据
scanf("%d",&t);
while(t--) {
int i,n;
int a[100005];
scanf("%d",&n);//每组数据的大小
for(i=0; i<n; i++) {
scanf("%d",&a[i]);
}
quicksort(a,0,n-1);
int flag=0;
for(i=0; i<n; i++) {//输出排完序后的数据
if(flag) printf(" ");
printf("%d",a[i]);
flag++;
}
printf("\n");
}
return 0;
}
![图片说明](https://img-ask.csdn.net/upload/201810/27/1540629349_608662.png)图片说明

  • 写回答

1条回答 默认 最新

  • 寻找自由的咸鱼 2018-10-27 09:25
    关注

    我觉得是你在把轴值放回去的操作出了问题,我讲快排写了三个函数,请您看一下是否有帮助

     int findpivot(int a[], int i, int j)
    {
        //return (i + j) / 2;
            return rand()%(j-i)+i; //随机给出轴值 
    }
    int partition(int *a, int l, int r, int& pivot)
    {
        do {
            while (a[++l]>pivot);//左面找到小于轴值的 
            while ((l<r) && (a[--r]<pivot));//右面找到大于轴值的 
            swap(a[l], a[r]);//将二者交换 
        } while (l<r);
        return l;//返回比轴值小的第一个数的位置 
    }
    void qsort(int *A, int i, int j) {
        if (j <= i)return;
        int pivotindex = findpivot(A, i, j);//随机产生一个轴 
        swap(A, pivotindex, j);//将轴值放到尾部 
        int k = partition(A, i - 1, j, A[j]);//k为划分后的右半部分的起始位置 
        swap(A, k, j); //将轴值放回去 
        qsort(A, i, k - 1);//递归 左 
        qsort(A, k + 1, j); //递归 右 
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥20 校园二手交易小程序搭建
  • ¥15 请问在ubuntu用conda创建环境报错怎么能解决
  • ¥15 STM32CubeMX/proteus按键控制指示灯颜色切换
  • ¥20 python,计算区位熵和扩张指数
  • ¥15 Python环境配置
  • ¥15 大四学生的困惑,有偿提问!
  • ¥15 解决页面无法编入索引:被“noindex”标签排除的问题?
  • ¥15 arduino测量电阻
  • ¥15 快手uid转快手号谁能解决 需要开发
  • ¥15 iis部署Django时css不生效,来个真人,ai不好使