冒泡排序,即对相邻的元素进行两两比较,两个元素顺序相反的话,就进行交换;这样每经过一次排序就会将最小的或最大的元素“冒”到顶端,最终完成排序。
具体步骤:1)比较前后相邻的两个数据,如果前面的数据大于后面对数据,就将这两个数据进行交换;
2)这样对数组的第0个数据到N-1个数据进行一次遍历后,最大一个数据就“沉”到数组的N-1个位置;
3)N=N-1,如果N不等于0的话,就重复上述1)2)步骤,否则排序完成。
时间复杂度:若原数组本身就是有序的,仅需N-1次就可以完成排序;如果是倒序的比较次数为N-1+N-2+...+1=N(N-1)/2次,交换次数与比较次数等值。
冒泡排序的平均时间复杂度为:O(n^2)
空间复杂度:没有利用新的数组来辅助完成排序,冒泡排序的空间复杂度为O(1)
图解:
下面看一下具体实现的代码:
Java实现冒泡排序
1.第一种方法
1 public class BubbleSort {
2 public static void main(String[] args) {
3 int[] arr={6,3,8,2,9,1};
4 System.out.println("排序前数组为:");
5 for(int num:arr){
6 System.out.print(num+" ");
7 }
8 for(int i=0;i<arr.length-1;i++){//外层循环控制排序趟数
9 for(int j=0;j<arr.length-1-i;j++){//内层循环控制每一趟排序多少次
10 if(arr[j]>arr[j+1]){
11 int temp=arr[j];
12 arr[j]=arr[j+1];
13 arr[j+1]=temp;
14 }
15 }
16 }
17 System.out.println();
18 System.out.println("排序后的数组为:");
19 for(int num:arr){
20 System.out.print(num+" ");
21 }
22 }
23 }
2.第二种方法
1 public static void BubbleSort1(int [] a, int n){
2 int i, j;
3 for(i=0; i<n; i++){//表示 n 次排序过程。
4 for(j=1; j<n-i; j++){
5 if(a[j-1] > a[j]){//前面的数字大于后面的数字就交换
6 //交换 a[j-1]和 a[j]
7 int temp;
8 temp = a[j-1];
9 a[j-1] = a[j];
10 a[j]=temp;
11 }
12 }
13 }
14 }
C语言实现冒泡排序
1 #include <iostream>
2 void BubbleSort(int *arr,int n){
3 for(int i=0;i<n;i++){
4 int flag = 0;
5 for(int j=0;j<n-1;j++){
6 if(arr[j]>arr[j+1]){
7 int t = arr[j];
8 arr[j] = arr[j+1];
9 arr[j+1] = t;
10 flag = 1;
11 }
12 }
13 if(!flag) break;
14 }
15 }
16 int main() {
17 int arr[8] = {3,2,5,8,4,7,6,9};
18 int n = 8;
19 bubbSort(arr,n);
20 for(int i=0;i<n;i++) {
21 printf("%d ",arr[i]);
22 }
23 return 0;
24 }