三个整数的排序
问题描述
输入三个数,比较其大小,并从大到小输出。
输入格式
一行三个整数。
输出格式
一行三个整数,从大到小排序。
样例输入
33 88 77
样例输出
88 77 33
package 排序;
import java. util. Arrays;
import java. util. Collections;
import java. util. Scanner;
public class 三个整数的排列 {
public static void main ( String[ ] args) {
Scanner sc= new Scanner ( System. in) ;
int [ ] a= new int [ 3 ] ;
for ( int i= 0 ; i< 3 ; i++ ) {
a[ i] = sc. nextInt ( ) ;
}
Arrays. sort ( a) ;
System. out. println ( a[ 2 ] ) ;
}
}
冒泡排序计数
考虑冒泡排序的一种实现。
bubble- sort ( A[ ] , n)
> round = 0
> while A is not sorted
> > round : = round + 1
> > for i : = 1 to n - 1
> > > if ( A[ i] > A[ i + 1 ] )
> > > > swap ( A[ i] , A[ i + 1 ] )
求1 . . n的排列中,有多少个排列使得A被扫描了K遍,亦即算法结束时round == K。
答案模20100713 输出。
输入格式
输入包含多组数据。每组数据为一行两个整数N,K。
输出格式
对每组数据,输出一行一个整数表示答案。
样例输入
3
3 0
3 1
3 2
样例输出
1
3
2
数据规模和约定
T <= 10 ^ 5 。
1 <= K < N < 10 ^ 6 。
冒泡法排序
输入10 个数,用“冒泡法”对10 个数排序(由小到大)这10 个数字在100 以内。
样例输入
1 3 6 8 2 7 9 0 4 5
样例输出
0 1 2 3 4 5 6 7 8 9
代码
package 排序;
import java. util. Scanner;
public class 冒泡排序 {
public static void main ( String[ ] args) {
Scanner sc= new Scanner ( System. in) ;
int [ ] a= new int [ 10 ] ;
for ( int i= 0 ; i< 10 ; i++ )
a[ i] = sc. nextInt ( ) ;
for ( int i= 0 ; i< 9 ; i++ ) {
for ( int j= 0 ; j< 9 - i; j++ ) {
if ( a[ j] > a[ j+ 1 ] ) {
int temp= a[ j] ;
a[ j] = a[ j+ 1 ] ;
a[ j+ 1 ] = temp;
}
}
}
for ( int i: a)
System. out. print ( i+ " " ) ;
}
}
插入排序
问题描述
排序,顾名思义,是将若干个元素按其大小关系排出一个顺序。形式化描述如下:有n个元素a[ 1 ] ,a[ 2 ] ,…,a[ n] ,从小到大排序就是将它们排成一个新顺序a[ i[ 1 ] ] < a[ i[ 2 ] ] < …< a[ i[ n] ]
i[ k] 为这个新顺序。
插入排序,顾名思义,是通过插入操作完成排序。其直觉和方法来源于打牌时安排牌的方法。每次摸起一张牌,你都会将其插入到现在手牌中它按顺序应在的那个位置。插入排序每一步都类似这个摸牌过程。比如现在有整数数组:{ 3 , 1 , 5 , 4 , 2 }
第一步:插入3 得到新序列{ 3 }
第二步:插入1 得到新序列{ 1 3 }
第三步:插入5 得到新序列{ 1 3 5 }
第四步:插入4 得到新序列{ 1 3 4 5 }
第五步:插入2 得到新序列{ 1 2 3 4 5 }
为了看程序中如何完成插入过程,我们以第五步为例:
初始时:1 3 4 5 2
将2 存入临时变量tmp
将下标j指向2 之前的元素5 ,然后根据tmp和a[ j] 的大小关系决定该元素是否应该后移。如果a[ j] > tmp,则将a[ j] 后移到a[ j+ 1 ] ,序列变成1 3 4 5 5 。
将下标j前移
判断a[ j] > tmp,后移a[ j] 到a[ j+ 1 ] ,得到1 3 4 4 5
将下标j前移
判断a[ j] > tmp,后移a[ j] 到a[ j+ 1 ] ,得到1 3 3 4 5
因为a[ j] <= tmp,所以将tmp放回a[ j+ 1 ] ,得到 1 2 3 4 5
现在,输入n个整数,根据以上算法,输出插入排序的全过程。
输入格式
第一行一个正整数n,表示元素个数
第二行为n个整数,以空格隔开
输出格式
有n个元素,因此输出部分分为n个部分,每个部分开头行为:Insert element[ i] ,i为第几个元素。然后对于每一个部分,输出该部分该元素在插入排序过程中的每一步产生的新序列,初始时的序列以Init: 打头,然后每一步后移数组元素后的元素序列以Move back: 打头,最后得到的最终结果序列以Final: 打头。序列元素间以一个空格隔开。示例请看样例输出。每一个部分的Insert element[ i] 之后的每一步的输出行之前要缩进两格,即输出两个空格。
样例输入
5
3 1 5 4 2
样例输出
Insert element[ 1 ] :
Init: 3
Final: 3
Insert element[ 2 ] :
Init: 3 1
Move back: 3 3
Final: 1 3
Insert element[ 3 ] :
Init: 1 3 5
Final: 1 3 5
Insert element[ 4 ] :
Init: 1 3 5 4
Move back: 1 3 5 5
Final: 1 3 4 5
Insert element[ 5 ] :
Init: 1 3 4 5 2
Move back: 1 3 4 5 5
Move back: 1 3 4 4 5
Move back: 1 3 3 4 5
Final: 1 2 3 4 5
数据规模和约定
n<= 100
整数元素在int 范围内
选择排序
问题描述
排序,顾名思义,是将若干个元素按其大小关系排出一个顺序。形式化描述如下:有n个元素a[ 1 ] ,a[ 2 ] ,…,a[ n] ,从小到大排序就是将它们排成一个新顺序a[ i[ 1 ] ] < a[ i[ 2 ] ] < …< a[ i[ n] ]
i[ k] 为这个新顺序。
选择排序的思想极其简单,每一步都把一个最小元素放到前面,如果有多个相等的最小元素,选择排位较考前的放到当前头部。还是那个例子:{ 3 1 5 4 2 } :
第一步将1 放到开头(第一个位置),也就是交换3 和1 ,即swap ( a[ 0 ] , a[ 1 ] ) 得到{ 1 3 5 4 2 }
第二步将2 放到第二个位置,也就是交换3 和2 ,即swap ( a[ 1 ] , a[ 4 ] ) 得到{ 1 2 5 4 3 }
第三步将3 放到第三个位置,也就是交换5 和3 ,即swap ( a[ 2 ] , a[ 4 ] ) 得到{ 1 2 3 4 5 }
第四步将4 放到第四个位置,也就是交换4 和4 ,即swap ( a[ 3 ] , a[ 3 ] ) 得到{ 1 2 3 4 5 }
第五步将5 放到第五个位置,也就是交换5 和5 ,即swap ( a[ 4 ] , a[ 4 ] ) 得到{ 1 2 3 4 5 }
输入n个整数,输出选择排序的全过程。
要求使用递归实现。
输入格式
第一行一个正整数n,表示元素个数
第二行为n个整数,以空格隔开
输出格式
共n行,每行输出第n步选择时交换哪两个位置的下标,以及交换得到的序列,格式:
swap ( a[ i] , a[ j] ) : a[ 0 ] … a[ n- 1 ]
i和j为所交换元素的下标,下标从0 开始,最初元素顺序按输入顺序。另外请保证i<= j
a[ 0 ] …a[ n- 1 ] 为交换后的序列,元素间以一个空格隔开
样例输入
5
4 3 1 1 2
样例输出
swap ( a[ 0 ] , a[ 2 ] ) : 1 3 4 1 2
swap ( a[ 1 ] , a[ 3 ] ) : 1 1 4 3 2
swap ( a[ 2 ] , a[ 4 ] ) : 1 1 2 3 4
swap ( a[ 3 ] , a[ 3 ] ) : 1 1 2 3 4
swap ( a[ 4 ] , a[ 4 ] ) : 1 1 2 3 4
数据规模和约定
n<= 100
整数元素在int 范围内
拓扑排序:士兵排队问题
试题
有N个士兵( 1 ≤N≤26 ) ,编号依次为A, B, C, …,队列训练时,指挥官要把一些士兵从高到矮一次排成一行,但现在指挥官不能直接获得每个人的身高信息,只能获得“P1比P2高”这样的比较结果( P1、P2∈A, B, C, …, Z, 记为 P1> P2) ,如”A> B”表示A比B高。
请编一程序,根据所得到的比较结果求出一种符合条件的排队方案。
(注:比较结果中没有涉及的士兵不参加排队)
输入要求
比较结果从文本文件中读入(文件由键盘输入),每个比较结果在文本文件中占一行。
输出要求
若输入数据无解,打印“No Answer! ”信息,否则从高到矮一次输出每一个士兵的编号,中间无分割符,并把结果写入文本文件中,文件由键盘输入:
样例输入
A> B
B> D
F> D
样例输出
AFBD
快速排序
问题描述
用递归来实现快速排序(quick sort)算法。快速排序算法的基本思路是:假设要对一个数组a进行排序,且a[ 0 ] = x。首先对数组中的元素进行调整,使x放在正确的位置上。同时,所有比x小的数都位于它的左边,所有比x大的数都位于它的右边。然后对于左、右两段区域,递归地调用快速排序算法来进行排序。
输入格式:输入只有一行,包括若干个整数(不超过10 个),以0 结尾。
输出格式:输出只有一行,即排序以后的结果(不包括末尾的0 )。
输入输出样例
样例输入
5 2 6 1 7 3 4 0
样例输出
1 2 3 4 5 6 7
逆序排列
问题描述
编写一个程序,读入一组整数(不超过20 个),并把它们保存在一个整型数组中。当用户输入0 时,表示输入结束。然后程序将把这个数组中的值按逆序重新存放,并打印出来。例如:假设用户输入了一组数据:7 19 - 5 6 2 0 ,那么程序将会把前五个有效数据保存在一个数组中,即7 19 - 5 6 2 ,然后把这个数组中的值按逆序重新存放,即变成了2 6 - 5 19 7 ,然后把它们打印出来。
输入格式:输入只有一行,由若干个整数组成,中间用空格隔开,最末尾的整数为0 。
输出格式:输出也只有一行,即逆序排列后的整数,中间用空格隔开,末尾没有空格。
输入输出样例
样例输入
7 19 - 5 6 2 0
样例输出
2 6 - 5 19 7