1.序言:
好久没写博文了。换了一家公司。工作地点也从苏州变成了北京。由于工作需要,从以前的纯上层APP,渐渐变成了一个,为算法写Demo的程序员。工作两年了,眼光也突然改变了。以前总是想学习新的技术,Kotlin,快应用,微信小程序,什么技术新颖就对什么感兴趣。但是到了新的公司后RxJava+Retrofit+MVP的模式从来没用过。取而代之的时OpenGL,坐标转换,JNI。突然觉得自己除了用别人写好的框架以外,什么都不会。技术总是在更新的,语言也可以改变,框架和库也会变,但是总有些不变的东西,比如说数据结构和算法,所以我想在空闲之余。在从新总结一下这方面的东西。
2.原理
冒泡排序是特别经典的排序之一,他的时间复杂度是O(N²)。
排序的思路是:排序时分成两层循环,内循环控制“冒泡”,外循环控制,内循环次数。内循环每次都会将两个数进行比较,如果前者大于后者就将两个数进行交换。直到该内循环结束为止。 每执行一次内循环都会将一个最大的数排序到最后。内循环执行次数由外循环控制。
3.注意
光看文字的话,可能有点懵了。下面直接上代码。代码上有注释。每层内循环和外循环,都打上了Log日志。
/**
* 数据交换
* @param aar 数据源
* @param i
* @param j
*/
private void swap(int[] aar, int i, int j) {
int temp = aar[i];
aar[i] = aar[j];
aar[j] = temp;
}
/**
* 冒泡排序
*
* @param aar
*/
public void BubbleSortA(int[] aar) {
if (aar == null || aar.length < 2)//保证aar不为null。且至少由两个数
return;
for (int i = 0; i < aar.length - 1; i++) {//控制总循环,进行n-1次循环
KLog.e("test外部:"+i);
boolean flag = true;//开关,若内层循环没有进行过交换,说明已经排好序了。无需在往下进行。
for (int j = 0; j < aar.length - i - 1; j++) {//内层循环,每次都从0开始。循环次数,慢慢减少。最大的数放到最后面
if (aar[j] > aar[j + 1]) {
swap(aar, j, j + 1);
flag = false;
KLog.e("test:"+j);
}
}
if (flag) {//跳出循环
break;
}
}
}
/**
* 冒泡排序
* @param aar
*/
public void BubbleSortB(int[] aar) {
if (aar == null || aar.length < 2) {
return;
}
for (int end = aar.length - 1; end > 0; end--) {//进行n-1次循环
boolean flag=true;//设置标记位
KLog.e("test外部:"+end);
for (int i = 0; i < end; i++) {//内部循环,从0开始,每次循环次数都减少。最大的数,冒泡到最后面。
if (aar[i]>aar[i+1]){
swap(aar,i,i+1);
flag=false;
KLog.e("test内部:"+i);
}
}
if (flag){
break;
}
}
}
4.
如果觉得本文能够帮助您的,帮忙点个赞。你的赞就是我最大的动力。希望大家都能打牢地基。这既是你的地基也是你的天花板。切记,只看不敲都是徒劳。帮忙点赞,谢谢亲。如有错误,请纠正。望你我共同进步!在这个互联网寒冬中,进一步提高自己的价值!