package sixhomework;
import java.util.Scanner;
public class work16 {
public static void main(String[] args) {
/*
* 从键盘输入三个整数,实现从小到大排序
* 分析:先输入三个数,然后比较大小
*/
Scanner scan = new Scanner(System.in);
System.out.println("请输入三个数");
int a = scan.nextInt();
int b = scan.nextInt();
int c = scan.nextInt();
int e;
int[]d = new int[] {a,b,c};
for(int i=0;i<d.length-1;i++) {
for(int j=0;j<d.length-1-i;j++) {
if(d[j]>d[j+1]) {
e=d[j];
d[j]=d[j+1];
d[j+1]=e;
}
}
}
for(int i=0;i<d.length;i++) {
System.out.println(d[i]);
}
}
}
这是昨天的冒泡排序代码,后来在仔细研究这个代码,发现它在几轮排序后有的时候一轮排序并不会改变位置,而这个时候就相当于白白浪费了排序次数,那有没有优化的方法呢?在经过研究别的大佬的博客,就发现的确有优化的方法,那就是加入一个Boolean型判断,当在本轮排序的时候,如果位置没有改变就说明是有序的,这个时候就可以跳出本轮循环,从而继续下一轮比较。看代码
package feisi.day01;
import java.util.Arrays;
public class eg6 {
public static void main(String[] args) {
/*
* 一个十个数的数组,然后从小到大排序
* 分析:先随机生成一个十位数的数组,然后使用冒泡排序来进行排序
*/
int[]a=new int[] {12,23,4,51,57,61,1,86,91,98};
for(int i =0;i<a.length-1;i++) {//控制比较轮次,一共比较数组长度减一次
int t =0;//该变量用来交换两个数据值的中间量
boolean flag=true;
for(int j=0;j<a.length-1-i;j++) {//控制两个挨着的元素比较
if(a[j]>a[j+1]) {
t = a[j];
a[j]=a[j+1];
a[j+1]=t;
flag = false;//如果元素交换了说明无序,而没有交换的话就说明元素已经是有序的了
}
conut++;
if(flag) {
break;
}//这一行代码得意思是终止当前内存循环,继续外层循环。
}
}
System.out.println(Arrays.toString(a));//以数组形式输出
System.out.println("比较的次数:"+count);
}
}
其中if判断语句一定要看清楚放的位置,一定是用来终止里面的循环,而不是外面的。(亲身经历),另外在查找数据的时候我还有了一个疑问,就是import static void main(String [] args)这一个语句 的具体意思。也查找了一下资料,其中public是一个修饰词,同时声明主函数为public就是告诉其他的类可以访问这个函数,static也是个修饰符,表示main函数是一个静态函数,不需要实例化对象就可以使用(这个实例化还有点没搞明白),void则表明返回值是无类型的,string[] 表示接收的字符串数组。 args 这个名字可以是任意的。至于为啥写这个是因为是一个单词的缩写(这一部分内容是借鉴一些博客大佬的),另外还有一个main,就相信大家都知道了,就是程序的入口。