本题要求实现一个函数,可快速查找给定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;
}