oj 1003: 你来做裁判(排序)

题目
众所周知,现在各大论坛有很多水王,他们的发贴数是如此之多,以至于必须要用高精度数才能保存。现在ACMForum决定举行一次水王争霸赛,比赛的规则是将这些水王截止到2007年4月28日23时59分59秒这一刻所发的总贴数从大到小进行排序。每个水王当然都想取得尽量靠前的名次,所以他们竭尽全力,不择手段地进行灌水。终于,激动人心的一刻到来了,2007年4月29日0时0分0秒,你作为裁判得到了每个水王的发贴数,现在,你的任务是公正地把这些水王按照发贴数从大到小进行排序。
Input
输入的第一行是一个1到1000的整数N,表示总共有N位水王参加了争霸赛。
Output
以下依次给出每位水王的描述,一位水王的描述占据一行,前面为一个仅由字母和数字组成的长度不超过20的字符串,代表这个水王的ID,后面为一个整数(非负数),代表这个水王的发贴数,注意,这个整数小于2,000,000,000。
依次输出按照发贴数从小到大排好序的各位水王的ID和这个水王的发贴数,ID和发贴数用空格分开。不能有任何多余的字符。若几个ID的发贴数相同,则按照ID输入的先后顺序进行排列。
Sample Input
Raw
6
Lowai 1986
Zhouyuan 2987
Maolaoda 2345
BuTaoCaiGuai 2548
ArthurKing 2003
Hyyylr 3185
Sample Output
Raw
Lowai 1986
ArthurKing 2003
Maolaoda 2345
BuTaoCaiGuai 2548
Zhouyuan 2987
Hyyylr 3185
构建两个数组来存放 ,当然也可以用结构体

#include<stdio.h>
#include<string.h>
int main()
{
	int b[100],n,i,j,t;
	char a[100][100],s[100];
	scanf("%d",&n);
	for (i=0;i<n;i++)
	scanf("%s%d",&a[i],&b[i]);
	for (i=0;i<n;i++)
	for (j=i+1;j<n;j++)
	if (b[i]>b[j]) 
	{
		t=b[i];
		b[i]=b[j];
		b[j]=t;
		strcpy(s,a[i]);
		strcpy(a[i],a[j]);
		strcpy(a[j],s);
	}
	for (i=0;i<n;i++)
	printf("%s %d\n",a[i],b[i]); 
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SWUST OJ413: 快速排序 快速排序是一种高效的排序算法,它的基本思想是通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按照此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列的目的。 快速排序的时间复杂度为O(nlogn),是一种非常高效的排序算法,被广泛应用于各种领域。 ### 回答2: 快速排序是一种高效的排序算法,它的核心就是“分治思想”,在数组中选择一个基准数,通过分区操作将数组分成两个部分,小于基准数的在左边,大于等于基准数的在右边,然后递归在左右两个子数组上继续进行快速排序。 快速排序的代码实现如下: ```c++ void quick_sort(int left, int right) { int i,j,temp; if(left > right) return; temp = a[left]; //基准数 i = left; j = right; while(i != j) { while(a[j] >= temp && i < j) j--; while(a[i] <= temp && i < j) i++; if(i < j) swap(a[i], a[j]); } a[left] = a[i]; a[i] = temp; //基准数归位 quick_sort(left, i - 1); //递归左边 quick_sort(i + 1, right); //递归右边 } ``` 在以上代码中,变量left代表数组左边界,right代表数组右边界,i和j是用来指向数组左右两端的指针,temp代表基准数。在while循环中,先从右边开始向左遍历,如果找到比基准数小的数,就停止;然后从左边开始向右遍历,如果找到比基准数大的数,也停止;如果i和j没有相遇就交换这两个数,重复上述操作。当i和j相遇时,再把基准数交换到i位置,接下来就可以递归处理左右两个子数组了。 快速排序的时间复杂度为O(nlogn),空间复杂度为O(logn)。在实际应用中,快速排序常作为其他高级排序算法的优化手段。 ### 回答3: 题目描述 实现 quick sort 样例 输入:[2,8,7,1,3,5,6,4] 输出:[1,2,3,4,5,6,7,8] 题目分析 快速排序是一种常用的排序算法,它的时间复杂度为O(nlogn),也是一种原地排序算法。 为了实现快速排序,首先需要选取一个数作为支点(pivot),通常选择序列的第一个数,然后将序列分成小于等于支点和大于支点的两个子序列。接着递归地对两个子序列进行快速排序。 快速排序的关键在于划分算法,一般称为 partition。划分算法的基本思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个序列有序的目的。 划分算法可以使用双指针法,即选取支点后,从序列的两端开始分别往中间遍历,找到第一个大于支点和第一个小于支点的数,交换两个数的位置,直到两个指针相遇,此时支点左边的数都比支点小,右边的数都比支点大。 在实现划分算法时,需要注意特殊的情况,例如序列为空或序列中所有数的值都相同,此时划分算法的效率不高,可加入一些特殊处理避免出现这些情况。 代码实现 下面是一份Python实现的代码。其中,quick_sort实现快速排序,partition实现划分算法。 def quick_sort(nums): """ 快速排序 :param nums: List[int] 待排序的序列 :return: List[int] 排序后的序列 """ if len(nums) <= 1: return nums return quick_sort_sub(nums, 0, len(nums) - 1) def quick_sort_sub(nums, left, right): """ 快速排序实现的辅助函数 :param nums: List[int] 待排序的序列 :param left: int 序列的左边界 :param right: int 序列的右边界 :return: List[int] 排序后的序列 """ if left >= right: return nums pivot = partition(nums, left, right) quick_sort_sub(nums, left, pivot - 1) quick_sort_sub(nums, pivot + 1, right) return nums def partition(nums, left, right): """ 划分算法 :param nums: List[int] 待排序的序列 :param left: int 序列的左边界 :param right: int 序列的右边界 :return: int 支点的位置 """ if left >= right: return left pivot = nums[left] i, j = left, right while i < j: while i < j and nums[j] >= pivot: j -= 1 while i < j and nums[i] <= pivot: i += 1 if i < j: nums[i], nums[j] = nums[j], nums[i] nums[left], nums[i] = nums[i], nums[left] return i 总结 快速排序是一种常用的排序算法,它的时间复杂度为O(nlogn),实现简单,对于大规模的数据排序效果良好。划分算法是快速排序的关键,使用双指针法,选取支点后,从序列的两端开始分别往中间遍历,找到第一个大于支点和第一个小于支点的数,交换两个数的位置,直到两个指针相遇,此时支点左边的数都比支点小,右边的数都比支点大。在实现划分算法时,需要注意特殊的情况,例如序列为空或序列中所有数的值都相同,此时划分算法的效率不高,可加入一些特殊处理避免出现这些情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值