冒泡排序是一种经典的排序算法,它主要的算法思想是相邻的元素两两进行比较,然后根据元素大小进行位置互换(也可以根据自定义条件),一轮交换之后最后面的元素肯定是最大的(也就是一轮排序后能确定一个元素的位置),这个算法的名字因为算法的过程是越大的元素会慢慢移动到数列的顶端而得以命名。
Bubble类
public class Bubble {
public static void main(String[] args) {
int[] arr = {3,1,6,8,5};
sort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
}
}
public static void sort(int[] arr){
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < arr.length-1-i; j++) {
if(arr[j] > arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
}
运行结果
输入数组的元素顺序是31685,冒泡排序后输出数组的元素顺序是13568
sort方法是冒泡排序方法,使用了双重循环语句,外层循环是用来确定循环的次数,内层循环是用于确定元素之间需要比较的次数。外层循环次数 i 是arr.length-1,因为如果有5个元素的话,循环4次就能确定4个元素的位置,总共有5个位置,确定了4个元素的位置,剩下的位置是唯一的,所以只需要循环arr.length-1即可。内层循环次数 j 是arr.length-1-i,外层循环次数 i 每次加1,就代表有一个元素的位置已经被确定,这时候内层循环就少一个需要比较的元素,所以内层循环次数 j 是随着外层循环次数 i 变化而变化的。最后在相邻的两个元素符合交换条件时,进行交换。
排序过程解析
输入数组 int arr = {3,1,6,8,5};
数组长度:5
排序次数:4
外层排序第一次:
内层排序第一次:3和1比较,3比1大,交换位置:1,3,6,8,5
内层排序第二次:3和6比较,3比6小,不交换位置:1,3,6,8,5
内层排序第三次:6和8比较,6比8小,不交换位置:1,3,6,8,5
内层排序第四次:8和5比较,8比5大,交换位置:1,3,6,5,8
外层排序第二次:
内层排序第一次:1和3比较,1比3小,不交换位置:1,3,6,5,8
内层排序第二次:3和6比较,3比6小,不交换位置:1,3,6,5,8
内层排序第三次:6和5比较,6比5大,交换位置:1,3,5,6,8
外层排序第三次:
内层排序第一次:1和3比较,1比3小,不交换位置:1,3,5,6,8
内层排序第二次:3和6比较,3比6小,不交换位置:1,3,5,6,8
外层排序第四次:
内层排序第一次:1和3比较,1比3小,不交换位置:1,3,5,6,8
时间复杂度
若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数 和记录移动次数 均达到最小值: , 。所以,冒泡排序最好的时间复杂度为 。若初始文件是反序的,需要进行 趟排序。每趟排序要进行 次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:
冒泡排序的最坏时间复杂度为 。综上,因此冒泡排序总的平均时间复杂度为 。