排序:冒泡排序计数、插入排序、选择排序、拓扑排序:士兵排队问题、快速排序、逆序排列、三个整数的排序

三个整数的排序

问题描述

  输入三个数,比较其大小,并从大到小输出。

输入格式

  一行三个整数。

输出格式

  一行三个整数,从大到小排序。

样例输入

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) {
		// TODO Auto-generated method stub
		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) {
		// TODO Auto-generated method stub
		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放到开头(第一个位置),也就是交换31,即swap(a[0],a[1])得到{1 3 5 4 2}
   第二步将2放到第二个位置,也就是交换32,即swap(a[1],a[4])得到{1 2 5 4 3}
   第三步将3放到第三个位置,也就是交换53,即swap(a[2],a[4])得到{1 2 3 4 5}
   第四步将4放到第四个位置,也就是交换44,即swap(a[3],a[3])得到{1 2 3 4 5}
   第五步将5放到第五个位置,也就是交换55,即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,,,…,队列训练时,指挥官要把一些士兵从高到矮一次排成一行,但现在指挥官不能直接获得每个人的身高信息,只能获得“P1比P2高”这样的比较结果(P1、P2∈A,,,,,记为 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
发布了342 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44522477/article/details/105309471