一、算法简述
冒泡排序(Bubble Sort)是一种简单直观的暴力枚举式排序算法。它重复地遍历要排序数组,每次比较两个相邻元素,如果顺序错误就把他们交换过来。直到数组已经按照顺序排列,冒泡算法之所以叫做“冒泡”,是因为最小的元素会经过不断交换,逐渐”上浮“到数列的最顶端,就像冒泡泡一样。
二、算法思路
遍历数组,按照数组下标从小到大的顺序,依次比较相邻的元素。如果前者大于后者就交换彼此。当遍历完整个数组后(也就是所有相邻元素都完成一次比较交换后),数组最后一个元素会是最大的数,称为已排序元素;其他元素为未排序元素。
按照上述步骤,再次遍历数组中所有未排序元素一次,数组倒数第二个元素会是第二大的数。
......
按照上述遍历方法,重复遍历数组n-1轮(n为数组长度),便完成所有元素的排序。
三、动画演示
四、代码实现
1.c++实现:
#include <iostream>
#include <cmath>
using namespace std;
//冒泡排序
void bubbleSort(int arr[],int len){int i,j,temp;for(i=1;i<len;i++){for(j=0;j<len-i;j++){if(arr[j]>arr[j+1]){temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}
}int main(){int arr[]={2,6,9,1,3,7,12,5,6,4,4,19,20,55};int len = sizeof(arr)/4;bubbleSort(arr,len);//输出结果:for(int i=0;i<len;i++){cout<<arr[i]<<" ";}
}
2.Java代码实现:
import java.util.Arrays;public class BubbleSort {private int size;//数组长度private int[] sourceArray = new int[size];//待排序数组//带参构造方法public BubbleSort(int size, int[] sourceArray) {this.size = size;this.sourceArray = sourceArray;}//冒泡排序算法public int[] solution(){int[] arr = Arrays.copyOf(sourceArray,sourceArray.length); //复制一份数组,以免改变原数组的值;for(int i=1;i<arr.length;i++){//第一次for循环作用是使这种交换进行n-1此,i并不参与进来for(int j=0;j<arr.length-i;j++){if(arr[j]>arr[j+1]){int temp = arr[j+1];arr[j+1]=arr[j];arr[j]=temp;}}}return arr;}public static void main(String[] args) {int[] arr1 = {2,6,9,1,3,7,12,5,6,4,4,19,20,55};BubbleSort b = new BubbleSort(arr1.length,arr1);int[] arr2 = b.solution();//调用BubbleSort对象中的排序方法,返回一个已排好序的数组;System.out.println(Arrays.toString(arr2));}
}
说明 :代码核心部分就是两次for循环:第二层for循环每次循环进行一轮排序,每轮排序完后可以得到一个已排序元素;第一层for循环作用就是进行n-1轮排序;
输出结果:
[1, 2, 3, 4, 4, 5, 6, 6, 7, 9, 12, 19, 20, 55]
五、算法分析
1.复杂度分析
时间复杂度:O(n^2)
空间复杂度:O(n)
2.该算法最快情况:
当输入的数组已经排好序时。此时时间复杂度为O(n)
2.该算法最坏情况:
当输入的数组是逆序时,每次比较都需要交换。最坏时间复杂度为O(n^2)