PTA 简单快速排序 c语言解法

本题要求实现一个函数,可快速查找给定x(保证是整个数据中其值存在,如果x有多个,查找第一个x)在整个数据中的排名(数据从大到小排列)情况,函数返回其排名(最大值为第1名,相同值的依次向后排名,即排名没有并列)。

函数接口定义:

int sort(int a[],int n,int x);

其中 a 和 x 都是用户传入的参数。 n 为元素个数, x 为等查数据。函数须返回 x 的排名。

裁判测试程序样例:

在这里给出函数被调用进行测试的例子。例如:
#include <stdio.h>
#define N 1000

int sort(int a[],int n,int x);

int main()
{
    int i,n,x,pos,a[N];
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    scanf("%d",&x);
    pos=sort(a,n,x);
    printf("%d pos: %d",x,pos);
    return 0;
}
/* 请在这里填写答案 */

输入样例:

10
12 83 83 45 64 32 123 83 79 96
83

输出样例:

83 pos: 3

快速排序的大致思想就是选定一个轴,把轴左边的数排序好,再选轴,再把轴左边的数排序好

下面为我的代码+注释

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

void quick_sort(int arr[], int low, int high) {
    if (low < high) {
        int pivot = partition(arr, low, high);
        quick_sort(arr, low, pivot - 1);
        quick_sort(arr, pivot + 1, high);
    }
}
//题目要求降序排序,所以左边的数都大于中心轴
int partition(int arr[], int low, int high) {
    int pivot = arr[high];   //确定一个比较的中心轴
    int i = low-1;
    for (int j = low; j <= high - 1; j++) {   //j从前往后遍历,相当于把大于轴的数都放在轴的左边
        if (arr[j] > pivot) {
            i++;
            swap(&arr[i], &arr[j]);
        }
    }
    swap(&arr[i+1], &arr[high]);  //让选定的轴放在排序好的右边
    return i+1;//返回当前轴的位置
}

int sort(int a[],int n,int x)
{
    quick_sort(a,0,n-1);
    int xx;
    for(int i=0;i<n;i++)
        if(a[i]==x){xx=i+1;break;}
    return xx;
}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值