Java初学
第一篇:冒泡排序实现思想和重点
前言
文章讲述了冒泡排序实现代码以及思想和重点
一、冒泡排序通俗理解
冒泡排序类似这样的游戏规则:有一队比赛者,从第一位开始比赛,前面的赢了后面的,后面的输了,你就座他的位置,接着比赛;如果前面的输给了后面,后面的赢了,你就止步于此,让后面赢了你的接着去比赛;直至最厉害的在荣登最后一位冠军;然后在从第一位开始比赛,去争夺亚军,直到全部都有了自己的名次。
二、冒泡排序实现代码
public class Main {
public static void mp (int[] arr){
for(int i = 0; i < arr.length-1; i++){
boolean flg = false;
for(int j = 0; j < arr.length-1-i; j++){
if(arr[j] > arr[j+1]){
int tmp = arr[j];
arr[j+1] = arr[j];
arr[j] = tmp;
flg = true;
}
}
if(flg = false){
return;
}
}
}
}
三、冒泡排序思想以及重点总结
- 思想一:冒泡排序数组排序次数
例如5个数就需要最多比较4次,最少比较1次;因为每次比较完成一趟,已经有一个数是有序的;那剩下4个数比较;
实现关键代码:
for(int i = 0; i < arr.length-1; i++)
- 思想二:数组排序对比次数
例如5个数就需要最多比较4次,因为每次比较完成一趟,已经有一个数是有序的;那剩下4个数比较就只要比较3次;(每次比较四次也可以,但因为后面的数已经有序,会显得多余)
重点1:
这里是引用每次都是从第一个开始比较,进行数的交换,因为每次排序完成后,最后那个是已经有序的,我们就只需把前面剩余的数当作一个整体去排序;这就是冒泡排序的精髓,越往上越大
重点2(冒泡排序时间复杂度)
内层循环次数是依次递减的,每次减少一次,假设有n项,第一次n-1,第二次n-2…最后是1,由思想2得知n项数列需要对比n-1次,所以利用等差数列求和,可以知道冒泡排序时间复杂度为:O( n^2 )
实现关键代码
for(int j = 0; j < arr.length-1-i; j++)
- 思想三:数的交换
例如5个数要由小到大排序,第一个数从数组第一个数开始,挨个向后比较,如果往后去比较,只要比到比自己小的就交换位置,如果比到比自己大的,就无法进入此次交换,接着第二个循环,j++,由后面的数继续去比较交换
重点3
因为每个数都乱序的,如上由小到大排序,如果下一个数比自己大,他无法进入此次交换,因此这2个数是有序的,但是我们永远不知后面的数有没有比他小的,所以我们要接着拿后面那个大的数去比较,因此数组的排序对比次数是不能像数组排序次数那样提前结束的;那怎样才能使得数组排序次数提前结束呢,请看思想4
重点4
(冒泡排序空间复杂度):冒泡排序的tmp变量,空间仅仅是一个临时变量,并且不会随着排序规模的扩大而进行改变,所以空间复杂度为O(1)
实现关键代码
if(arr[j] > arr[j+1])
- 思想四:检查有序,提前结束数组排序
例如给定5个数,5个数由小到大排序,从第一次比较,前面比自己大的,然后接着循环到最后一次循环,都是前面比自己大,我们就if(flg = false),结束循环返回;
实现关键代码
if(arr[j] > [arr[j+1]){ flg = true;}
if(flg = false){return;}
上述均为个人编写,如有错误,欢迎批评指正!