算法基础-冒泡排序
Posted 谓戒
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法基础-冒泡排序相关的知识,希望对你有一定的参考价值。
核心思想:交换排序,通过相邻数据的比较和交换来达到排序的目的;
过程:
(1)比较相邻的元素,如果第一个比第二个大,彼此交换;
(2)从开始循环1操作到结尾,那么最后元素就是max值;
(3)针对所有元素重复2过程,除了上一步得到的max值;
(4)那么每次循环都会比上一次少操作一个数,直到没有数据可操作;
优化:
(1)加入一个局部变量,当某次循环完的时候没有元素交换,则停止;
(2)从开始循环到结尾,再从末尾循环到开始;
时间复杂度计算:
(1)如果我们的元素正序,只需要循环一次即可完成排序,所需的比较次C和元素交换次数M均为最小值,Cmin=n-1,Mmin=0;此时冒泡排序是最好的时间复杂度O(n);
(2)如果不幸我们的元素刚好是反序,则需要进行n-1次排序,每次排序排序要进行n-1次元素交换,且每次都需要移动三个元素完成交换过程,此时比较和交换次数都达到最大值,Cmax=n(n-1)/2=O(n^2),Mmax=3n(n-1)/2=O(n^2);则最坏时间复杂度O(n^2);
(3)所以冒泡排序的平均时间复杂度是O(n^2);
实例:
public void bubbleSort(int[] arr){
log.debug("冒泡开始,元素:" + Arrays.toString(arr));
boolean good = true;
for(int i=0;i<arr.length-1;i++){
for(int j=0;j<arr.length-i-1;j++){
if(arr[j] > arr[j+1]){
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
good = false;
}
}
if(good){
break;
}
}
log.debug("冒泡结束,元素:" + Arrays.toString(arr));
}
*更一步的优化需要考虑:20181011
以上是关于算法基础-冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章