冒泡排序
方法
给定数组n,要求升序
先看n[0],n[1]位置上的数,如果n[0]>n[1],则交换,否则不交换
再看n[1],n[2]位置上的数,如果n[1]>n[2],则交换,否则不交换
… 到最后一个数,那么最后一个数就是最大的
然后对[0,N-2]中的数,重复以上步骤
… 重复以上步骤,
直到整个数组呈升序排列
代码实现
public class BubbleSort {
public static void sort(int[] arr) {
//当数组长度为0或者1的时候,就没有必要排序,直接返回就行了
if (arr == null || arr.length < 2){
return;
}
//end就是循环多少次,第一次就是[0,end],第二次就是[0,end-1],以此类推
//规定一个每次缩减的范围
for (int end = arr.length-1;end > 0;end --){
//范围固定之后
//从0位置开始和1位置比较,如果大于就交换,小于等于不动,然后开始比较1和2位置的数,以此类推
for (int i = 0; i < end; i++) {
if (arr[i] > arr[i+1]){
//自己封装了一个工具类就是简单交换
ArraySwapTool.swap(arr,i,i+1);
}
}
}
}
}
时间复杂度分析
for (int end = arr.length-1;end > 0;end --){
for (int i = 0; i < end; i++) {
//for循环里面都是常数操作
if (arr[i] > arr[i+1]){
ArraySwapTool.swap(arr,i,i+1);
}
}
}
第一个for循环就是确定一个递减的范围,并没有对样本量进行操作,第二个循环才是对缩减范围中的样本量进行操作,每一次操作一个递减范围,就是N-1+N-2+N-3+…+1,一直过一个递减的范围,那么最后的表达式就是一个等差数列求和,那么就是O(n^2)
所以冒泡排序的时间复杂度就是O(n^2)