常见排序方法
原创文章,转载请添加本网页链接
https://blog.csdn.net/qq_37334950/article/details/104375022
1、冒泡排序:比较相邻的元素,前一个大于后一个,则交换他们
举例:
初始状态:3 6 4 2 11 10 5
第一次排序:3 4 2 6 10 5 11(比较六次,11沉到未排序序列尾部)
第二次排序:3 2 4 6 5 10 11(比较五次,10沉到未排序序列尾部)
第三次排序:2 3 4 5 6 10 11(比较四次,6沉到未排序序列尾部,按照例子的数组来说,此时已经排序结束,为了视觉直观,下面也列出来)
第四次排序:2 3 4 5 6 10 11(比较三次,5沉到未排序序列尾部)
第五次排序:2 3 4 5 6 10 11(比较二次,4沉到未排序序列尾部)
第六次排序:2 3 4 5 6 10 11(比较一次,3沉到未排序序列尾部)
分析:
对于n个数据的数组进行冒泡排序,进行了(n-1)次排序,第一次排序比较了(n-1)次,最后一次排序只比较1次,每次比较(n-1)至1次,平均每次[(n-1)+1]/2 = n/2次,总计[n(n-1)]/2次。
代码逻辑:
首先写一个(n-1)的for循环A代表(n-1)次排序,然后在A循环内部再写一个以
(n-1)到1为上限的for循环B代表比较的次数,最后在B循环内部做判断是否交换
元素
代码示例(代码工具-AS):
public static void main(String args[]){
ArrayList<Integer> list = new ArrayList<>();
list.add(3);
list.add(6);
list.add(4);
list.add(2);
list.add(11);
list.add(10);
list.add(5);
log(list);//打印数组
/**
* 冒泡排序
*/
int i = list.size();//拿到数组的大小
for (int j = i; j > 1 ; j--){//(n-1)的for循环代表(n-1)次排序
System.out.println("第"+ (list.size() - j + 1) +"次排序");
for (int k = 1;k < j;k++){//(n-1)到1为上限的for循环代表比较的次数
System.out.println(" 第"+ (k) +"次比较");
int l = list.get(k-1);
if (l > list.get(k)){//做判断是否交换元素
list.set(k-1,list.get(k));
list.set(k,l);
}
}
log(list);//打印数组
}
log(list);//打印数组
}
/**
* 打印数组
* @param list 要打印的数组
*/
private static void log(ArrayList<Integer> list){
String s = "";
for (int m = 0; m < list.size(); m++) {
if (m == 0){
s = list.get(0)+"";
} else {
s = s + "," + (list.get(m)+"");
}
}
System.out.println("--打印数组:" + s);
}
结果一览:
排序成功,但是如结果显示,第三次排序的结果已经是最终排序结果,那么第四次开始到第六次都是无用功,那么要修改一下排序代码,添加判断条件isChanged:当本次排序没有元素互换位置,则直接break跳出排序的for循环
代码示例:
public static void main(String args[]){
ArrayList<Integer> list = new ArrayList<>();
list.add(3);
list.add(6);
list.add(4);
list.add(2);
list.add(11);
list.add(10);
list.add(5);
log(list);//打印数组
/**
* 冒泡排序
*/
boolean isChanged = true;//初始值需要为true,为了第一次判断通过
int i = list.size();//拿到数组的大小
for (int j = i; j > 1 ; j-- ){//(n-1)的for循环代表(n-1)次排序
if (isChanged){
isChanged = false;
System.out.println("第"+ (list.size() - j + 1) +"次排序");
for (int k = 1;k < j;k++){//(n-1)到1为上限的for循环代表比较的次数
System.out.print(" 第"+ (k) +"次比较");
int l = list.get(k-1);
if (l > list.get(k)){//做判断是否交换元素
list.set(k-1,list.get(k));
list.set(k,l);
isChanged = true;
}
}
log(list);//打印数组
} else {
System.out.println("第"+ (list.size() - j + 1) +"次排序,不需要再排序了,跳出循环");
break;
}
}
log(list);//打印数组
}
结果分析:上面说了第三次排序已经是最终结果了,这里为什么还会有第四次排序呢,其实是因为第四次排序的比较结束后,我们才发现当前数组没有元素互换,数组已经是最终结果,所以第四次排序虽然是排序,但是本质相当于是一次检验,检验出当前的数组已经是最终结果,那么下一次排序将打破for循环