PTA 排序(快速排序,基数排序)

本文介绍了PAT考试中的排名生成问题,该问题涉及到排序算法的应用。首先,文章概述了快速排序的基本原理和C++实现,接着解释了基数排序的概念,它是桶排序的一种优化。在给定的样例输入和输出中,展示了如何根据得分和提交记录生成排名。解决方案包括将数据整理成结构体,并利用STL的sort函数进行排序,同时注意排序函数的编写和结构体数组的声明方式。此外,文章强调了在处理过程中初始化标志变量、处理重复满分成绩等问题的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速排序
在一堆数中选取一个主元,以主元为中心将这堆数分为大小两部分,对这两部分递归调用快排,最后当规模最够小的时候(小于预设的阈值CutOff)将使用简单排序(如插入排序)。

/*快速排序*/
//取主元 get pivot
long Median3(long a[], long Left, long Right)
{
   
   
	int Center = (Right +Left)/2;
	if (a[Left] > a[Center])
		Swap(&a[Left] , &a[Center]);
	if (a[Left] > a[Right])
		Swap(&a[Left], &a[Right]);
	if (a[Center] > a[Right])
		Swap( &a[Center] , &a[Right]);

	Swap(&a[Center], &a[Right - 1]);//把Povit藏到Right-1
	return a[Right - 1];
}
//快速排序
void QuickSort(long a[], int Left, int Right)
{
   
   	
	long Pivot;//主元
	int i, j;

	int CutOff = 10e2;
	if (CutOff <= Right - Left)
	{
   
   
		Pivot = Median3(a, Left, Right);
		i = Left; //左边指针
		j = Right - 1; //右边指针

		for (;;)
		{
   
   
			while (a[++i] < Pivot) {
   
   }
			while (a[--j] < Pivot) {
   
   }
			if (i < j)
				Swap(&a[i], &a[j]);
			else
				break;
		}
		Swap(&a[i], &a[Right - 1]); //Pivot 落位
		QuickSort(a, Left, i - 1);
		QuickSort(a, i + 1, Right);
	}
	else
		Insertion_sort(a+Left, Right - Left+1);
}
//统一接口
void Quick_sort(long a[],int N)
{
   
   
	QuickSort(a, 0, N - 1);

}
/*快速排序结束*/

快排c++背诵版:

class Solution {
   
   
public:
    vector<int> sortArray(vector<int>& nums) {
   
   
        int n = nums.size();
        quick_sort(nums,0,n-1,n);
        return nums;
    }
    void quick_sort(vector<int>& nums,int left,int right,int n)
    {
   
   
        if(left < right) //分裂到最小单位即停止
        {
   
   
            int pivotpos = partition(nums,left,right);
            quick_sort(nums,left,pivotpos-1,n);
            quick_sort(nums,pivotpos+1,right,n);
        }
    }

    int
### 关于重庆科技大学PTA平台上的基数排序题目与教程 在处理涉及 **PTA 平台** 和 **基数排序** 的相关内容时,可以参考以下信息: #### 基数排序简介 基数排序是一种非比较型整数排序算法,其原理是通过将整数按位数切割成不同的数字,然后按照每位数字分别进行排序。这种方法通常适用于固定长度的数值数据。对于 PTA 上的相关题目,可能涉及到实现一种基于桶的方式完成排序的任务。 根据引用中的描述[^2],桶式排序属于基数排序的一种具体形式。它利用二维数组作为存储结构来模拟多个“桶”,从而达到对一组正整数从小到大排列的目的。 --- #### C语言实现简单基数排序示例代码 以下是针对类似需求设计的一段C语言程序代码片段用于演示如何运用桶的概念来进行基本的数据整理工作: ```c #include <stdio.h> #define MAX_NUMBERS 15 // 定义最大数量为15个数 void bucketSort(int numbers[], int array_size){ const int BUCKETS = 10; int buckets[BUCKETS][MAX_NUMBERS]; int counts[BUCKETS]={0}; for (int pass=0;pass<4;pass++){//假设最多四位数 for (int i=0;i<array_size;i++){ int digit=(numbers[i]/(int)(pow(10,pass)))%10; buckets[digit][counts[digit]]=numbers[i]; counts[digit]++; } int index=0; for (int b=0;b<Buckets;b++){ for (int c=0;c<counts[b];c++) numbers[index++]=buckets[b][c]; counts[b]=0;//重置计数器以便下次循环使用 } } } int main(){ int nums[MAX_NUMBERS]; printf("请输入%d个正整数:\n",MAX_NUMBERS); for(int i=0;i<MAX_NUMBERS;i++)scanf("%d",&nums[i]); bucketSort(nums,MAX_NUMBERS); printf("排序后的结果:"); for(int i=0;i<MAX_NUMBERS;i++)printf("%d ",nums[i]); } ``` 此代码实现了基础版本的桶排序逻辑,并能够满足大多数情况下关于小规模数据集合的操作需求。 --- #### 注意事项 当参与像重庆科技学院所使用的 `PTA` 测试环境提交作业时,请特别留意某些特殊规则。例如,在动态分配内存方面可能存在特定限制条件[^1]。因此建议严格按照官方文档说明调整自己的解决方案以确保所有测试案例均能顺利通过验证。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值