冒泡排序

时间:2022-04-22
本文章向大家介绍冒泡排序,主要内容包括乱序情况下:、正序情况下、逆序情况下:、全部代码:、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

冒泡排序时间复杂度上为O(n^2)

冒泡排序三种方式,第一种也是最基本的排序:

void bubbleSort1(int *arr,int length){
    int i,j,k;
    for(i=0;i<length;i++){
        for(j=i+1;j<length;j++){
            if(arr[i]>arr[j]){
                k = arr[j];
                arr[j] = arr[i];
                arr[i] = k;
            }
        }
    }
}

第二种是循环的时候,j指针从尾部开始,每次可以顺便排序其他的元素

void bubbleSort2(int *arr,int length){
    int i,j,k;
    for(i=0;i<length;i++){
        for(j=length-1;j>=i;j--){
            if(arr[j] < arr[j-1]){
                k = arr[j-1];
                arr[j-1] = arr[j];
                arr[j] = k;
            }
        }
    }
}

第三种是加入一个标记为,如果一次遍历发现没有元素冒泡,那么立刻停止

void bubbleSort3(int *arr,int length){
    int i,j,k;
    bool flag = true;
    for(i=0;i<length && flag; i++){
        flag = false;
        for(j=i+1;j<length;j++){
            if(arr[i] > arr[j]){
                k = arr[j];
                arr[j] = arr[i];
                arr[i] = k;
                flag = true;
            }
        }
    }
}

测试后发现,除了正序的极端情况下,第三种的冒泡排序快一些,其他情况下的冒泡排序都是原始的最简单的方法快。

乱序情况下:

正序情况下

逆序情况下:

全部代码:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <time.h>
  4 void copy(int *arr,int length);
  5 void bubbleSort1(int *arr,int length);
  6 void bubbleSort2(int *arr,int length);
  7 void bubbleSort3(int *arr,int length);
  8 void print(int *arr,int length);
  9 //int arrtest[10] = {3,4,7,8,0,9,1,2,6,5};
 10 //int arrtest[10] = {0,1,2,3,4,5,6,7,8,9};
 11 int arrtest[10] = {9,8,7,6,5,4,3,2,1,0};
 12 int main(){
 13     int i;
 14     clock_t start,end;
 15     int Array[10];
 16     copy(Array,10);
 17     print(Array,10);
 18     printf("bubble 1:n");
 19     start = clock();
 20     for(i=0;i<100000;i++){
 21         copy(Array,10);
 22         //print(Array,10);
 23         bubbleSort1(Array,10);
 24     }
 25     end = clock();
 26     print(Array,10);
 27     printf("bubble 1 time: %d nn",end-start);
 28 
 29     printf("bubble 2:n");
 30     start = clock();
 31     for(i=0;i<100000;i++){
 32         copy(Array,10);
 33         //print(Array,10);
 34         bubbleSort2(Array,10);
 35     }
 36     end = clock();
 37     print(Array,10);
 38     printf("bubble 2 time: %d nn",end-start);
 39     
 40     printf("bubble 3:n");
 41     start = clock();
 42     for(i=0;i<100000;i++){
 43         copy(Array,10);
 44         //print(Array,10);
 45         bubbleSort3(Array,10);
 46     }
 47     end = clock();
 48     print(Array,10);
 49     printf("bubble 3 time: %d nn",end-start);
 50     
 51     getchar();
 52     return 0;
 53 }
 54 void copy(int *arr,int length){
 55     int i;
 56     for(i=0;i<length;i++){
 57         arr[i] = arrtest[i];
 58     }
 59 }
 60 void bubbleSort1(int *arr,int length){
 61     int i,j,k;
 62     for(i=0;i<length;i++){
 63         for(j=i+1;j<length;j++){
 64             if(arr[i]>arr[j]){
 65                 k = arr[j];
 66                 arr[j] = arr[i];
 67                 arr[i] = k;
 68             }
 69         }
 70     }
 71 }
 72 void bubbleSort2(int *arr,int length){
 73     int i,j,k;
 74     for(i=0;i<length;i++){
 75         for(j=length-1;j>=i;j--){
 76             if(arr[j] < arr[j-1]){
 77                 k = arr[j-1];
 78                 arr[j-1] = arr[j];
 79                 arr[j] = k;
 80             }
 81         }
 82     }
 83 }
 84 void bubbleSort3(int *arr,int length){
 85     int i,j,k;
 86     bool flag = true;
 87     for(i=0;i<length && flag; i++){
 88         flag = false;
 89         for(j=i+1;j<length;j++){
 90             if(arr[i] > arr[j]){
 91                 k = arr[j];
 92                 arr[j] = arr[i];
 93                 arr[i] = k;
 94                 flag = true;
 95             }
 96         }
 97     }
 98 }
 99 void print(int *arr,int length){
100     int i;
101     for(i=0;i<length;i++){
102         printf("%d ",arr[i]);
103     }
104     printf("n");
105 }

最终可以看到:

冒泡排序方法1>2>3

而从时间运行角度来说:正序情况下最快,乱序排中,逆序情况下最慢