60:选择排序
总时间限制:
100ms
内存限制:
32767kB
描述
选择排序输出的是对n个元素的原序列的一个重排<a0,a1,a2,...,an-1>;,使得a0<= a1<= a2<= .......<= an-1
选择排序思想
n个元素的直接选择排序可经过n-1趟直接选择排序得到有序结果:
①初始状态:无序区为R[0..n-1],有序区为空。
②第1趟排序
在无序区R[0..n-1]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[0]交换,使R[0..0]和R[1..n-1]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
……
③第i趟排序
第i趟排序开始时,当前有序区和无序区分别为R[0..i-1]和R[i..n-1]。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R[i]交换,使R[0..i]和R[i+1, n-1]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
输入一个整数序列,请输出选择排序每趟排序的结果。
输入
输入有2行,第一行是一个整数n,表示第2行会有n个整数。
输出
输出对第2行的n个整数每趟选择排序的结果。
样例输入
8
75 23 64 32 54 91 89 17
样例输出
17 23 64 32 54 91 89 75
17 23 64 32 54 91 89 75
17 23 32 64 54 91 89 75
17 23 32 54 64 91 89 75
17 23 32 54 64 91 89 75
17 23 32 54 64 75 89 91
17 23 32 54 64 75 89 91
提示
n个整数,选择排序应该执行 n - 1 趟。
实现代码如下:
import java.util.Scanner; /** * @author baikunlong * @date 2020/6/22 22:25 */ public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int[] nums=new int[n]; for (int i = 0; i < n; i++) { nums[i]=scanner.nextInt(); } for (int i = 0; i < n-1; i++) { int min=nums[i]; int index=-1; for (int j = i+1; j < n; j++) { if(min>nums[j]){ min=nums[j]; index=j; } } if(index!=-1){ int t=nums[i]; nums[i]=min; nums[index]=t; } for (int j = 0; j < nums.length-1; j++) { System.out.print(nums[j]+" "); } if(i!=n-2){ System.out.print(nums[nums.length-1]+"\n"); }else { System.out.print(nums[nums.length-1]+""); } } } }