一、前言:
这是怀化学院的:Java数据结构中的一道难度中等的一道编程题(此方法为博主自己研究,问题基本解决,若有bug欢迎下方评论提出意见,我会第一时间改进代码,谢谢!) 后面其他编程题只要我写完,并成功实现,会陆续更新,记得三连哈哈! 所有答案供参考,不是标准答案,是博主自己研究的写法。(这一个题书上也有现成的代码,重要的是理解它的算法原理!)
二、题目要求如下:
(第 7 题) 直接插入排序(难度系数75)
直接插入排序
描述
利用直接插入排序算法实现线性表的排序。要求输出第k趟排序的结果。例如原来线性表为:26,12,25,4,36,15,21,第一趟直接排序排序结果为: 12, 26,25,4,36,15,21,第二趟直接插入排序结果为: 12,25, 26,4,36,15,21。
输入
第一个为元素个数n(1<=n<=1000),第二行为n个元素值(整数),即需要排序的元素个数,第三行为k(1<=k<=n-1),即要求的第k趟排序结果。
输出
对每一测试用例,用一行输出第k趟排序结果,用空格隔开。
样例输入
5
2 4 1 9 7
3样例输出
1 2 4 9 7
三、代码实现:(代码的做题原理全部在代码注释中,若还有疑问也可以翻书)
(1)自己创建了一个直接插入排序类:
package com.fs.so;
import java.util.Scanner;
public class Insert_Sort {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); //排序的元素个数
int[]data= new int[n];
for(int i=0;i<n;i++){
data[i]=sc.nextInt(); //依次给每个元素赋值
}
int k = sc.nextInt(); //要求进行直接插入排序的躺数
for(int j=1;j<=k;j++){
int temp=data[j]; //从第二个元素(无序区)开始进行插入排序,默认第一个元素是有序区
int x=j-1; //之所以放外面是为了外循环可以使用a变量
while(x>=0&&data[x]>temp){ //如果有序区的最后一个元素要大于无序区的第一个要插入的元素,那么插入进去的元素要与有序区最后一个元素调换位置
data[x+1]=data[x]; //把原来有序区的较大的那个元素给它赋值到后面一个位置
--x; //再x先减1,判断有序区的上一个元素是否也大于插进来的那个元素,如何是,则又把插入的元素前移
}
data[x+1]=temp; //若比较完后:要插入排序的元素要比所有,在有序区的所有元素都大,那么直接放在原来无序区的第一个元素位置,并j++有序区扩大,无序区缩小
}
for(int b=0;b<n;b++){
System.out.print(data[b]+" ");
}
}
}
四、不同情况的代码测试运行结果:
<1>首先是题目中的测试输入样例:
<2>其他情况测试结果: