一 、冒泡排序
1、逻辑:
1生成一个长度为10的随机数组
2先进行第一轮排序,相邻元素大的往后挪,确定一个最大的数
3重复以上排序 从绝对无序状态变为相对有序,最终绝对有序。
效果图如下
2、代码
public class Demo {
public static void main(String[] args) {
int [] a =new int[10];
for (int i = 0; i <a.length ; i++) {
a[i]=(int)(Math.random()*100);
}
System.out.println("生成的数组为"+Arrays.toString(a));
int tmp;
int c=0;
for (int i = 0; i < a.length; i++) {
c++;
for (int j = 0; j <a.length-1 ; j++) {
if(a[j]>a[j+1]){
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
System.out.println("排序好的数组为"+Arrays.toString(a));
System.out.println("循环了"+c+"次");
}
}
3、优化
1:每轮最后几个排好的还要再排,重复排序。
2:已经绝对有序了 ,轮数还没结束,还要继续排。
import java.util.Arrays;
public class Demo {
public static void main(String[] args) {
// int [] a =new int[10];
// for (int i = 0; i <a.length ; i++) {
// a[i]=(int)(Math.random()*100);
// }
// System.out.println("生成的数组为"+Arrays.toString(a));
int [] a={44, 33, 96, 78, 18, 61, 97, 34, 59, 74};
int tmp;
int c=0;
int i;
for ( i = 0; i < a.length; i++) {
boolean flag=true;
for (int j = 0; j <a.length-1-i; j++) {
c++;
if(a[j]>a[j+1]){
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
flag =false;
}
}
if(flag){break;}
System.out.println("第"+(i+1)+"轮的排序的数组"+Arrays.toString(a));
}
System.out.println("排序好的数组为"+Arrays.toString(a));
System.out.println("循环了"+c+"次共"+(i-1)+"轮排完");
}
}
二 、选择排序
1、逻辑
1)定个中间变量,第一轮数组里所有的元素与之比大小,比他小的与之交换。
2)第一轮所有元素都比较大小之后,最小的元素与第一个位置的元素数值交换
3)重复以上过程
动图
2、代码
import java.util.Arrays;
public class Demo1 {
public static void main(String[] args) {
int [] a =new int[10];
for (int i = 0; i <a.length ; i++) {
a[i]=(int)(Math.random()*100);
}
System.out.println("生成的数组为"+ Arrays.toString(a));
int tmp;
int c=0;
int i;
for ( i = 0; i <a.length-1 ; i++) {
int min=i;
for (int j = i+1; j < a.length; j++) {
c++;
if(a[j]<a[min]){
min=j;
}
}
tmp=a[min];
a[min]=a[i];
a[i]=tmp;
System.out.println("第"+(i+1)+"轮的排序的数组"+Arrays.toString(a));
}
System.out.println("排序好的数组为"+Arrays.toString(a));
System.out.println("循环了"+c+"次");
}
}
三、插入排序
1、逻辑
1)从第一个元素开始,该元素可认为已排序
2)取出下一个元素,在已排序的元素序列中从后向前扫描
3)如果该元素(已排序)大于待插入元素 ,把它移到下一个位置
4)重复以上过程
2、代码
不会
在这里插入代码片