冒泡排序

来源:互联网 发布:淘宝一件代发教学 编辑:程序博客网 时间:2024/05/29 09:55

冒泡排序

冒泡排序是一种比较简单的排序算法,它是一种线性排序算法,通过对相邻两个元素的比较和交换来对元素进行排序。


原理

假定现在有一个长度为n的数组{a1,a2,...,an}
1. 从a1开始到an1,每一个数都与它下一位的元素进行比较,如果比下一位的元素大,就交换两个元素的位置。
2. 通过第一次遍历后,最大的数就被筛选出来,放在an的位置,相当于这个数已经被放在正确的位置上。
3. n–,重复前面两步,直到所有的元素都被放在正确的位置上。想当于排除掉已经放在正确位置上的数,对剩下的数组元素做排序。

每一次对剩余每一次遍历可以确定一个数的位置,第n-1次遍历完成之后数组排序完成。

分析

初始数组 {43512}
这里分析第一次排序

  1.  4 3 比较,完成后  3  4  5  1  2
  2.  4 5 比较,完成后  3  4  5  1  2
  3.  5 1 比较,完成后  3  4  1  5  2
  4.  5 2 比较,完成后  3  4  1  2  5

可以发现第一次的排序就是将最大值5移到最后一位的过程。

代码

void swap(int* a, int* b){    int temp = *a;    *a = *b;    *b = temp;}void bubbleSort(int* arr, int len){    for(int i = 0; i < len - 1; i++) {        for(int j = i + 1; j < len; j++) {            if(arr[i] > arr[j]) {                swap(arr + i, arr + j);            }        }    }}

优化

  现在对初始数组 {51234} 进行冒泡排序。
经过第一次排序后我们发现数组变成了 {12345},已经数组中的所有元素已经有序,但是根据程序我们还要再继续三次遍历,这样就造成了时间上的损失。
  因为冒泡排序只有在前数比后数大时才会交换,我们可以定义一个指针,指向最后一个做交换的后数,它之后的所有数必定已经是有序的。

void bubble(int* arr, int len){    int p = len - 1;    while(p) {        int k = p;        p = 0;        for(int i = 1; i < k; i++) {            if(arr[i - 1] > arr[i]) {                swap(arr + i - 1, arr + i);                p = i;            }        }    }}

时间复杂度

n个元素的数组要进行n-1次遍历,每次遍历最多进行的交换次数依次为
n-1 , n-2 , n-3 , …. , 1
将其相加,结果为

i=1n1i=n(n1)2

所以冒泡排序的时间复杂度为 O(n2),这是一种在处理大量数据时比较慢的排序算法。

原创粉丝点击