DS内排—直插排序
题目描述
给定一组数据,使用直插排序完成数据的升序排序。
--程序要求--
若使用C++只能include一个头文件iostream;若使用C语言只能include一个头文件stdio
程序中若include多过一个头文件,不看代码,作0分处理
不允许使用第三方对象或函数实现本题的要求
输入
数据个数n,n个数据
输出
直插排序的每一趟排序结果
样例输入
7 34 23 677 2 1 453 3
样例输出
23 34 677 2 1 453 3
23 34 677 2 1 453 3
2 23 34 677 1 453 3
1 2 23 34 677 453 3
1 2 23 34 453 677 3
1 2 3 23 34 453 677
Solution:
import java.util.*;
public class Main{
public static void main(String args[]){
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] array = new int[n+1];
for (int i = 1; i <=n ; i++) {//读取数字存储到数组中
array[i] = scanner.nextInt();
}
//直插排序,从小到大
for (int i = 2; i <=n ; i++) {//由于只有一个数字的情况下,第一个数字已经排好序,从2开始
if (array[i]<array[i-1]){//如果当前数字小于前一个,说明需要交换
array[0] = array[i];//用0作为哨兵,存储当前结点
array[i] = array[i-1];
int j;
for (j = i-2; array[0]<array[j]; --j)//查找合适位置的同时将大于它的数后移
array[j+1] = array[j];
array[j+1] = array[0];
}
for (int k = 1; k <=n ; k++) {
System.out.print(array[k]);
if (k!=n)
System.out.print(" ");
}
System.out.println();
}
}
}