目录
思路:第一轮for循环其实就可以确定是否序列内是否含有升序的序列
优点:如果一个序列的部分是有序的,那么有一定的优化作用。含大量的内部有序序列则优化作用很大。
缺点:每次需要多运行3个多余的语句,反而对于一般的无序的序列,运行的时间会更长
冒泡排序
代码1:
public class Main {
public static void main(String[] args) {
//冒泡排序
int[] array = {16, 12, 17, 89, 72, 67, 1};
//for(){}
for (int i = 1; i < array.length; i++) {//从[数组[1]开始,数组的长度]这个区间。遍历6次
if (array[i] < array[i - 1]) {
int temp = array[i];//交换两个数字的时候先存小的
array[i] = array[i - 1];//再大的给小的
array[i-1] = temp;//最后存的小的给大的
}
}
for(int i = 0; i < array.length; i++){
System.out.print(array[i] + "_");
}
}
}
此处写成for(int i =1; i<= array.length - 1; i++)也可以
记住array.length是7,不能想当然地认为是最后一个元素没有被遍历到。
之后要让所有元素都排序,需要每次排序的长度递减,array.length是在不断变化的。
增加for循环,进行递减。
代码2:
public class Main {
public static void main(String[] args) {
//冒泡排序
int[] array = {16, 12, 17, 89, 72, 67, 1};
for(int end = array.length - 1;end > 0; end--){//length-1是需要每次排序的长度递减7元素只需要6次排序即可,六次都要执行完才行所以end > 0
for (int i = 1; i <= end ; i++) {//用end代替了array.length,但是此处要执行7次所以<号要加等号
if (array[i] < array[i - 1]) {
int temp = array[i];
array[i] = array[i - 1];
array[i-1] = temp;
}
}
}
for(int i = 0; i < array.length; i++){
System.out.print(array[i] + "_");
}
}
}
理解数组长度为n是的下标[0]和for循环次数和<、<=,>、>=之间的关系
for(int end = array.length - 1;end > 0; end--){}
遍历数组长度-1次。
【改进1】如果元素含有升序的序列:
思路:第一轮for循环其实就可以确定是否序列内是否含有升序的序列
方法:
增加一个boolean类型的sorted,假定本次对前面的元素比较都是升序的。
来判断本次是否进入了if(),若进入了,进行if(sorted),继续执行外循环遍历短了一次的数组;
若本次未进入,则代表此次的遍历的元素的后方元素都是大于它的,继续执行外循环遍历短了一次的数组;
public class Main {
public static void main(String[] args) {
//冒泡排序
int[] array = {16, 12, 17, 89, 72, 67, 1};
for(int end = array.length - 1;end > 0; end--){
boolean sorted = true;//增1
for (int i = 1; i <= end ; i++) {
if (array[i] < array[i - 1]) {
int temp = array[i];
array[i] = array[i - 1];
array[i-1] = temp;
sorted =false;//增2
}
}
if(sorted) break;//增3
}
for(int i = 0; i < array.length; i++){
System.out.print(array[i] + "_");
}
}
}