vlambda博客
学习文章列表

常用算法——冒泡法排序(Bubble Sort)


重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

冒泡排序是通过集合内相邻两个元素两两比较来排序的,每一次比较都是从位于集合内的前两个元素开始的,只不过每次需要比较的长度减1。如果比较两个元素相等,则不进行交换,冒泡排序是一种稳定排序。

第1次排序的比较次数:n-1 ,即n个元素相邻两两比较,需要n-1次比较;

第2次排序的比较次数:n-2,即第一次排序后最后一个元素可以确定为最大值,不再需要参与第二次排序;

第3次排序的比较次数:n-3  同理,最后两个数已经确定,不再需要参与排序;

第 n-1 次排序的比较次数:1 ;


总的比较次数为 (n-1) + (n-2) + (n-3) + …+1 = n*(n-1)/2 ,所以冒泡排序的时间复杂度是 O(n^2)。空间复杂度是 O(1) 。


#include<stdio.h>

#include<stdlib.h>

#include<string.h>

 

//冒泡排序

void bubbleSort(int arr[ ], int length)

{    

        int temp;

        for(int i =0;i<length-1;i++)

        {

                for(int j =0;j<length-i-1;j++)

               {

                     if(arr[j]>arr[j+1])

                    {

                             temp = arr[j];

                            arr[j]=arr[j+1];

                            arr[j+1]=temp;    

                     }

                }

         }

}

 

//打印元素

void printArr(int arr[ ],int length)

{

        for(int i=0;i<length;i++)

                printf("%d\t",arr[i]);

        printf("\n");

}

 

int main()

{

        int arr[10]={3,5,2,10,8,9,6,4,7,1};

        int length = sizeof(arr)/sizeof(int);

        length = 10;

        bubbleSort(arr,length);

        printArr(arr,length);

        return 0;

}

注:sizeof是C语言中保留关键字,也可以认为是一种运算符,单目运算符。sizeof的作用是获取数据在内存中所占用的存储空间,以字节为单位来计数。

常用算法——冒泡法排序(Bubble Sort)