基本思想
从数组中第一个数开始,依次遍历数组中的每一个数,通过相邻比较交换,每一轮循环下来找出剩余未排序数的中的最大数并”冒泡”至数列的顶端。
特点
数据结构:数组
稳定性:稳定
过程
初始关键字: 『 6,5,3,1,8,7,2,4 』
第一趟排序: 『6,5,3,1,8,7,2,4 』
5,『 6,3,1,8,7,2,4 』
5,3,『 6,1,8,7,2,4 』
5,3,1,『 6,8,7,2,4 』
5,3,1,6,『 8,7,2,4 』
5,3,1,6,7,『 8,2,4 』
5,3,1,6,7,2,『 8,4 』
5,3,1,6,7,2,4,『 8 』
第二趟排序: 『 5,3,1,6,7,2,4 』,8
3,『5,1,6,7,2,4』,8
3,1,『5,6,7,2,4』,8
3,1,5,『6,7,2,4』,8
3,1,5,6,『7,2,4』,8
3,1,5,6,2,『7,4』,8
3,1,5,6,2,4,『7』,8
第三趟排序: 『 3,1,5,6,2,4 』,7,8
1,『3,5,6,2,4』,7,8
1,3,『5,6,2,4』,7,8
1,3,5,『6,2,4』,7,8
1,3,5,2,『6,4』,7,8
1,3,5,2,4,『6』,7,8
第四趟排序: 『 1,3,5,2,4 』,6,7,8
1,『3,5,2,4』,6,7,8
1,3,『5,2,4』,6,7,8
1,3,2,『5,4』,6,7,8
1,3,2,4,『5』,6,7,8
第五趟排序: 『 1,3,2,4 』,5,6,7,8
1,『3,2,4』,5,6,7,8
1,2,『3,4』,5,6,7,8
1,2,3,『4』,5,6,7,8
第六趟排序: 『 1,2,3 』,4,5,6,7,8
1,『2,3』,4,5,6,7,8
1,2,『3』,4,5,6,7,8
第七趟排序: 『 1,2 』,3,4,5,6,7,8
『 1 』,2,3,4,5,6,7,8
结果: 『 1,2,3,4,5,6,7,8 』
排序过程 宏观过程
【复杂度与辅助空间】
最差时间复杂度:O(n^2)
最优时间复杂度:O(n)
平均时间复杂度:O(n^2)
所需辅助空间:O(1)
实现方法
双重循环,外层i控制每轮进行多少次比较,内层循环j控制每轮i次比较相邻两元素是否逆序,若逆序,则进行交换。
注:设有n个元素,则共进行n-1趟交换,设每趟趟数为i,则每趟比较n-i次。
源程序
void bubble_sort(int a[],int n){
for (int i = 0; i < n - 1; i++){//循环的次数为数组长度减一
for (int j = 0; j < n – 1 - i; j++){//循环次数为待排序数第一位数冒泡至最高位的比较次数
if (a[j] > a[j + 1]){//找出未排序序列中的最小值
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
优化
void bubble_sort(int a[],int n)
{
bool flag;
for (int i = 0; i < n - 1; i++)//循环的次数为数组长度减一
{
flag = true;//判断是否有交换
for (int j = 0; j < n – 1 - i; j++)//循环次数为待排序数第一位数冒泡至最高位的比较次数
if (a[j] > a[j + 1])//找出未排序序列中的最小值
{
swap(a[j],a[j + 1]);
flag = false;//有交换说明仍需排序
}
if (flag) break;//若无交换,终止循环
}
}
JAVA版本
import java.util.Arrays;
public class BubbleSort1 {
public static void BubbleSort(int[] arr) {
boolean flag = true;
while(flag){
int temp;//定义一个临时变量
for(int i=0;i<arr.length-1;i++){//冒泡趟数,n-1趟
for(int j=0;j<arr.length-i-1;j++){
if(arr[j+1]<arr[j]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
flag = true;
}
}
if(!flag){
break;//若果没有发生交换,则退出循环
}
}
}
}
public static void main(String[] args) {
int arr[] = new int[]{1,6,2,2,5};
BubbleSort.BubbleSort(arr);
System.out.println(Arrays.toString(arr));
}
}