ACM详解(5)——排序

备战ACM资料 <br />备战ACM资料<br />一:知识点<br />    数据结构:<br />      1,单,双链表及循环链表<br />      2,树的表示与存储,二叉树(概念,遍历)二叉树的          <br />         应用(二叉排序树,判定树,博弈树,解答树等)<br />      3,文件操作(从文本文件中读入数据并输出到文本文       <br />         件中)<br />      4,图(基本概念,存储结构,图的运算)<br />   数学知识<br / 阅读详情

 

有些ACM 题需要使用一些基本的数据结构,下面首先介绍与排序相关的内容。
1、基本排序
Problem Description
These days, I am thinking about a question, how can I get a problem as easy as A+B? It is fairly difficulty to do such a thing. Of course, I got it after many waking nights.
Give you some integers, your task is to sort these number ascending ( 升序).
You should know how easy the problem is now!
Good luck!
Input
Input contains multiple test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow. Each test case contains an integer N (1<=N<=1000 the number of integers to be sorted) and then N integers follow in the same line.
It is guarantied that all integers are in the range of 32-int.
Output
For each case, print the sorting result, and one line one case.
Sample Input
2
3 2 1 3
9 1 4 7 2 5 8 3 6 9
Sample Output
1 2 3
1 2 3 4 5 6 7 8 9
翻译:对给定的数字序列进行排序。使用数据结构的基本排序算法即可。可以使用各种排序算法实现。另外在Java 中提供了排序方法,可以使用Arrays.sort 方法,参考下面的代码:
Arrays.sort(a);
其中a 是需要排序的数组。
下面给出了冒泡排序的代码供参考:
       /*
        * 冒泡排序
        */
       public static int[] sort(int[] a){
              // Arrays.sort(a);
              for(int i=0;i<a.length-1;i++){
                     for(int j=a.length-1;j>i;j--){
                            if(a[j]<a[j-1]){
                                   int temp = a[j];
                                   a[j] = a[j-1];
                                   a[j-1] = temp;
                            }
                     }
              }
              return a;
       }
2、DNA Sorting
Description
One measure of ``unsortedness'' in a sequence is the number of pairs of entries that are out of order with respect to each other. For instance, in the letter sequence ``DAABEC'', this measure is 5, since D is greater than four letters to its right and E is greater than one letter to its right. This measure is called the number of inversions in the sequence. The sequence ``AACEDGG'' has only one inversion (E and D)---it is nearly sorted---while the sequence ``ZWQM'' has 6 inversions (it is as unsorted as can be---exactly the reverse of sorted).
 
You are responsible for cataloguing a sequence of DNA strings (sequences containing only the four letters A, C, G, and T). However, you want to catalog them, not in alphabetical order, but rather in order of ``sortedness'', from ``most sorted'' to ``least sorted''. All the strings are of the same length.
 
Input
 
The first line contains two integers: a positive integer n (0 < n <= 50) giving the length of the strings; and a positive integer m (0 < m <= 100) giving the number of strings. These are followed by m lines, each containing a string of length n.
Output
 
Output the list of input strings, arranged from ``most sorted'' to ``least sorted''. Since two strings can be equally sorted, then output them according to the orginal order.
Sample Input
10 6
AACATGAAGG
TTTTGGCCAA
TTTGGCCAAA
GATCAGATTT
CCCGGGGGGA
ATCGATGCAT
 
Sample Output
CCCGGGGGGA
AACATGAAGG
GATCAGATTT
ATCGATGCAT
TTTTGGCCAA
TTTGGCCAAA
 
翻译:对于一个序列的无序性可以使用相互之间无序的元素组的个数表示,例如字母序列DAABEC 的无序性是5,D大于后面的AABC,E大于后面的C。而AACEDGG 的无序性是1,因为只有E和D之间的顺序是乱的。
题目要求:对于给定的多个字符串(长度相同,由A, C, G 和T 组成),从最有序到最无序进行排列。
解题思路:计算每个字符串的无序性,然后进行排序即可。参考下面的代码:
       /*
        * DNA sorting
        */
       public static void test3(String[] dnas){
              Map invertions = new HashMap();
              // 计算每个字符串的乱序数量
              for(int i=0;i<dnas.length;i++){
                     invertions.put(dnas[i], count(dnas[i]));
              }
              // 排序
              for(int i=0;i<dnas.length-1;i++){
                     for(int j=dnas.length-1;j>i;j--){
                            if((Integer)(invertions.get(dnas[j]))<(Integer)(invertions.get(dnas[j-1]))){
                                   String temp = dnas[j];
                                   dnas[j] = dnas[j-1];
                                   dnas[j-1] = temp;
                            }
                     }
              }
              // 输出
              for(String temp:dnas){
                     System.out.println(temp+invertions.get(temp));
              }
             
       }
    // 计算无序性
       public static int count(String dna){
              int sum=0;
              for(int i=0;i<dna.length()-1;i++){
                     char temp = dna.charAt(i);
                     for(int j=i+1;j<dna.length();j++){
                            if(temp>dna.charAt(j))
                                   sum++;
                     }
              }
              return sum;
       }
上面计算无序性的代码是通过遍历字符串中的每个元素,然后判断后续的每个字符和它之间是否有序,需要遍历两次。如果字符串不是很长,这种算法还可以接受。如果字符串很长,计算将很耗时。下面的方法进行了改进。
    /*
     * 计算无序性(改进算法)
     */
    public static int count2(String dna){
       int count[] = new int [4];
       Arrays.fill(count,0);
       int sum=0;
       for ( int i=dna.length()-1;i>=0;i--){
           char temp = dna.charAt(i);
           switch (temp){
           case 'A' :
              count[0]++;
              break ;
           case 'C' :
              count[1]++;
              sum = sum+count[0]; // 加上 C 后面的 A 的个数
              break ;
           case 'G' :
              count[2]++;
              sum = sum+count[0]+count[1]; // 加上 G 后面的 A 和 C 的数量
              break ;
           case 'T' :
              count[3]++;
              sum = sum+count[0]+count[1]+count[2]; // 加上 G 后面的 A 、 C 和 G 的数量
              break ;
           }
       }
       return sum;
    }
另外在代码中,对序列进行排序是自己编写的排序算法。也可以使用系统提供的排序功能,需要编写一个类,参考代码如下:
class DNA implements Comparable{
       String content;
       int unsortness;
       DNA(String content,int unsortness){
              this.content = content;
              this.unsortness = unsortness;
       }
       @Override
       public int compareTo(Object o) {
              return unsortness-((DNA)o).unsortness;
       }    
}
修改后的代码如下:
    /*
     * DNA sorting
     */
    public static void test3(String[] dnas){
       DNA newDnas[] = new DNA[dnas. length ];
       for ( int i=0;i<dnas. length ;i++){
           newDnas[i] = new DNA(dnas[i],count(dnas[i]));
       }
       Arrays.sort(newDnas); // 替换了原来的排序算法
       // 输出
       for (DNA temp:newDnas){
           System. out .println(temp. content +temp. unsortness );
       }     
    }
延伸阅读:

李绪成 优快云 Blog:http://blog.youkuaiyun.com/javaeeteacher
优快云学生大本营:
http://student.youkuaiyun.com/space.php?uid=124362
如果喜欢我的文章,就加我为好友:
http://student.youkuaiyun.com/invite.php?u=124362&c=7be8ba2b6f3b6cc5

最多排序到最少排序(分治法) 一.程序题(共1题,100.0分) 1、在线编程题4.求解按“最多排序”到“最少排序”的顺序排列问题 【问题描述】一个序列中的“未排序”的度量是相对于彼此顺序不一致的条目对的数量,例如,在字母序列“DAABEC”中该度量为5,因为D大于其右边的4个字母,E大于其右边的1个字母。该度量称为该序列的逆序数。序列“AACEDGG”只有一个逆序对(E和D),它几乎被排好序了,而序列“ZWQM”有6个逆序对,它是未排序的,恰好是反序。 需要对若干个DNA序列(仅包含4个字母A、C、G和T的字符串)分类,注意是分类而不 阅读详情

相关推荐

华为OD机试真题精讲:最长的顺子(Python/Java/C++多语言实现)

摘要:本文介绍了华为OD机试高频题目"最长的顺子"的解题思路与多语言实现。题目要求在扑克牌数组中,利用万能牌(0)组成最长连续顺子。核心解法包括:1)数据预处理(去重排序);2)滑动窗口算法计算可填补间隙的最长子序列;3)边界条件处理。提供了Python、Java、C++三种实现,均通过时间复杂度O(n log n)和空间复杂度O(n)的优化,满足题目对10^5数据量的性能要求。

bkspiderx的博客 211

C++-PTA 求解按“最多排序”到“最小排序”的顺序排列问题。

PTA 求解按“最多排序”到“最小排序”的顺序排列问题。

害怕也得前进 4302

ACM编程竞赛代码实践详解

国际大学生程序设计竞赛(ACM-ICPC)是一项由国际计算机学会(ACM)主办的全球性算法竞赛。这一章将简要介绍ACM-ICPC的起源、竞赛模式和它在编程界的重要性。字符串处理技巧在编程竞赛中占有重要地位。理解和掌握基础的字符串匹配算法,如朴素匹配和KMP算法,以及字符串处理的高级技巧,如字符串哈希,对于解决复杂问题至关重要。在实际应用中,通过将这些算法与其他算法结合,可以优化问题的解决过程,提升代码的运行效率。在后续的章节中,我们将继续探讨ACM竞赛中其他重要的算法和数据结构的应用。

weixin_42311427的博客 1076

ACM入门基础-排序

写在前面 在入门算法中最为重要的我认为就是排序算法了,将数据排序后将会有许多良好的性质,有序、递增的数据很多时候就是解题的关键,排序算法有很多,常见的有冒泡排序、选择排序、快速排序、归并排序、桶排序…排序算法五花八门,但归根到底的作用就是将无序的数据进行升序或者降序排序,本文通过几道例题来分析各个排序算法的使用场景以及优劣性,但是本文不具体讲述排序算法的实现过程,侧重于对数据的分析从而选择合适的算法。 各大排序时间算法复杂度 数据量:n 数据范围 :m 冒泡、选择排序 时间复杂度O(n2)O(n^{2})

TGX的博客 856

ACM竞赛新手编程训练:杭电11页基础题详解

ACM国际大学生程序设计竞赛(ACM International Collegiate Programming Contest,简称ACM ICPC)是一项由国际计算机学会(ACM)主办的年度性竞赛,旨在激发大学生对算法和程序设计的兴趣,同时也提供了一个展示自己编程能力和团队合作精神的平台。竞赛的历史可以追溯到1970年,当时由美国IBM公司赞助,竞赛的形式和宗旨几乎没有变化,强调的一直是解决复杂问题的能力和编写高效、优雅代码的能力。

weixin_36047538的博客 867

Abaqus中使用Python提取裂缝数据并用matplotlib库绘图

ABAQUS后处理PYTHON二次开发代码:提取裂缝数据并用matplotlib库绘图

qq_42568527的博客 3472

[ACM] 常用排序算法对比

文章目录字典序十大排序不稳定排序快速排序 - 每次排序让标志位一边都比它大,另一边都比它小缺点:数据已经有序时,时间复杂度退化为 O(n2)O(n^2)O(n2)堆排序 -优点:时间复杂度恒定为 O(nlog⁡n)O(n \log{n})O(nlogn)选择排序 - 每次遍历选出最小的和 first++ 交换希尔排序 - 分为多个子序列进行插入排序稳定排序冒泡排序 - 每次选两个向后依次比较直接插入排序(打牌) - 每次选一个依次和前面比优点:数据几乎有序时时间复杂度达到 O(n)O(n)O(n)归并排序非

qq_43435084的博客 1642

ArcGIS高效拆分shp文件:无需依赖属性表的实用技巧

本文针对ArcGIS中shp文件因属性表缺失而难以拆分的问题,详细介绍了无需依赖属性表的实用技巧。核心是使用“拆分多部件要素”工具,直接根据图形结构将多个独立但被合并的部件拆分为单个要素,并提供了ArcGIS Pro和ArcMap的操作流程、关键注意事项及拆分后的属性处理方案。

n2o3p4的博客 379

2023华为机试真题

0,3]和[1,3]的公共区间为[1,3],[0,3]和[3,5]的公共区间为[3,3],[0,3]和[3,6]的公共区间为[3,3], [1,3]和[3,5]的共区间为[3,3],[1,3]和[3,6]的共区间为[3,3], [3,5]和[3,6]的公共区间为[3,5], 公共区间列表为[[1,3], [3,3], [3,5]],他们合并后的区间为[1,5]。任意两个给定区间的交集,称为公共区间(如:[1,2], [2,3]的公共区间为[2,2], [3,5],[3,6]的公共区间为[3,5])。

z_ssyy的博客 1万+

Claude Code 使用 OpenAI Codex(GPT-5.3-Codex)完整配置教程

通过 LiteLLM 可以让 Claude Code 调用任何模型,包括:OpenAIDeepSeekGemini本地模型↓↓优点:不依赖 Anthropic API可自由切换模型支持统一 AI Gateway这种“LLM Gateway 架构”正在成为 AI 开发工具的主流实践。

Jacobe_zhao的博客 1万+

基于Python的网贷平台数据爬虫实战:Scrapy+Selenium+反反爬策略

python复制下载# items.py本文详细介绍了如何使用Python构建一个完整的网贷平台数据爬虫系统,涵盖了从基础爬取到高级反反爬策略的全套解决方案。我们使用了Scrapy框架作为基础,结合Selenium处理动态内容,实现了多种反反爬策略,并探讨了分布式爬虫的实现方式。机器学习识别验证码基于深度学习的网页结构变化检测自动化行为模拟的更精细控制基于Kubernetes的弹性爬虫集群。

2201_76125261的博客 1560

ACM排序

ACM比赛中排序方法 1.C的qsort #include 代码: int cmp(const void *p,const void *q) { return *((int *)p)-*((int *)q); } qsort(array,n,sizeof(array[0]),cmp) 六类qsort排序方法: qsort函数很好用,但有时不太会用比如按结构体一级

xuruoxin的专栏 1201

多跳问答技术解析:从原理到金融领域实践

多跳问答(Multi-hop QA)是自然语言处理中的高级任务,要求系统通过多步推理整合分散信息来回答问题。其核心技术在于理解文档间的复杂关联,相比单跳问答需要更精细的数据集设计和模型架构。在金融、医疗等专业领域,多跳问答能有效处理如'腾讯大股东投资的港股上市公司'这类需要串联多个信息点的问题。典型实现方案包括MR-Search框架的三级检索器设计,分别处理实体召回、关系匹配和数值比较。当前最佳实践表明,结合稠密检索与稀疏检索的混合策略,配合动态路由机制,能在保持较高精度的同时控制计算成本。这类技术在金融风

weixin_42566072的博客 607

ACM[排序题]

题目描述(如有错误,欢迎提出,谢谢,我将继续努力) 今年的ACM世界总决赛快要开始了,需要有一个排名算法来对每支队伍进行现场排名。ACM组委会把这个任务交给了你,相信你一定能很好地完成。 排名规则如下:通过题的数目多的队伍排名靠前,如果有多支队伍过的题的数目相同,则罚时少的队伍排名靠前。 输入 输入的第一行包括一个整数N(1,代表参加比赛的队伍的个数。 接下来的N行每行包括一

bubbleTg的博客 2438

PSM倾向性评分分析介绍、spss进行倾向性评分分析示例

PSM倾向性评分分析介绍、spss进行倾向性评分分析示例

statistics+insight+vista+power 1483

Visual Studio 2022+Qt6.5.3安装教程+环境配置+创建Qt项目+乱码插件+运行很完美(16岁孩子也能看懂)

Visual Studio 2022+Qt6.5.3安装教程+环境配置+创建Qt项目+乱码插件+运行很完美(16岁孩子也能看懂)

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 1190

拿到acm铜奖可以去大厂吗?

从ACM选手的角度讲: 为什么ACM选手在大家眼里都这么牛逼,原因就是很多ACM选手从中学就开始打比赛,你想想看,在你大学才懂一些简单的数据结构和算法的时候,这些中学生就已经ACM竞赛中畅游了。当然,也不是所有人都这样,比如我就不属于这一批,本人大一才开始准备。 除此之外,ACM的题目都很难,难到什么程度?本人在准备期间刷题刷到一度恶心。ACM竞赛很注重选手的分析和思维两方面的能力,在算法和数据结构这样已经足够复杂的题型下,还要进行大量的变形,所以没有一个高强度的培训是不可能有能力参赛。 所以,经历过AC

九章算法的博客 9425

AutoCAD中圆弧折线化方法与实现

在AutoCAD中,圆弧折线化是将圆弧曲线转换为由一系列线段组成的折线曲线的过程。本文将介绍如何使用LISP编写代码来实现圆弧折线化,并提供相应的源代码。上述示例代码将生成一个以坐标原点为圆心、起点为(5.0, 0.0, 0.0)、终点为(0.0, 5.0, 0.0)、半径为5.0、角度为90度的圆弧的折线表示。通过使用上述的LISP代码,你可以在AutoCAD中实现将圆弧转换为折线的功能。你可以根据需要修改代码中的参数来适应不同的圆弧转换需求。函数,并传入圆弧的起点、终点、圆心、半径和角度参数。

VcuOcaml的博客 1419

【ACM】C++程序设计ACM题库总结

浙江工业大学ACM部分题解析+代码

chenmeng的博客 4407

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

acm新手小白必看系列之(2)——基本排序及cmp函数精讲及例题

acm新手小白必看系列之(2)——排序及cmp函数 sort排序 sort是c++自带函数 复杂度 n*log(n) 包含在头文件 #include的c++标准库里 函数有三个参数 1.要排序的数组的起始地址 2.数组的结束地址 3.第三个参数是排序的方法,可以不写,默认是从小到大 sort(a,a+n) -----默认从小到大排序 比如 int a[ ]={2,7,1,5,0} 我们可以写...

永恒之蓝的博客 2701

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

ACM部分学习路线

前言:接触ACM也有接近一年的时间了,上一学年学习的知识点也是零零散散,最近打算好好根据论坛上找到的学习路线重新拉一遍,顺便写写博客记录题解和算法笔记,这也算是来优快云发布的第一篇文章了。这篇文章只是一篇总结和链接,各个知识点的链接会根据我的复习(学习)进度陆续更新,希望能完结。 参考文章: ACM算法学习路线、清单 ACM路线 算法竞赛入门到进阶 --- 完整学习路线(含知识点讲解) ACM学习计划 一.基础篇 众所周知,ACM竞赛是三人小队,三个人每个人都会选择不同的方向...

issey的博客 2935

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

ACM练习 小Z来讲排名规则(WA)【C++ stable_sort稳定排序】

描述 本次比赛严格按照ACM的排名规则进行,但可能很多小伙伴并不太了解这个排名方法,今天小Z来给大家简单说明一下。每个人的排名根据他解出的题目数量、做题时间还有错误提交次数决定,呃。。。在某些特殊情况下跟大家的昵称也有关系哟~不过不要着急去改昵称,毕竟是特殊情况,很难遇到的。下面我具体说明一下。 排名的第一关键字是解出的题目数,也就是说,解出题目数量多的小伙伴一定会排在解出题目数量少的小伙伴前...

寒泉 1万+
上一篇: ACM模拟题详解(4)——递归
下一篇: ACM详解(6)——栈
老李-大连
博客等级 码龄20年 3206粉丝 308原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值