首页 > 代码库 > 冒泡排序

冒泡排序

交换排序是指在排序过程中,通过待排序记录序列中元素间关键字的比较,将数据元素进行交换来达到排序目的的方法,主要包括冒泡排序和快速排序。

冒泡排序的基本思想是对所有相邻记录的关键字进行比较,如果a[j]>a[j+1]则将其交换,最终达到有序化。其处理步骤如下:

(1)首先将整个待排序的记录分为有序区和无序区,初始状态有序区为空无序区则为整个待排序的记录。

(2)对无序区从前往后依次将相邻记录的关键字进行比较,若逆序则进行交换,从而使得较大的数据元素右移,这样最终形成有序序列。

通过上面的步骤可以发现,每一次冒泡排序都将无序区中最大的数据元素移到有序区的最右边。并且,对于含n个数据元素的数据序列,最多需要经过n-1趟冒泡排序。

void BubbleSort(int* a,int length){    if (a == NULL || length <= 0)        return;    int i, j,temp;    for (i = length - 1; i > 0; i--){        for (j = 0; j <i; j++){            if (a[j]>a[j + 1]){                temp = a[j];                a[j] = a[j + 1];                a[j + 1] = temp;            }        }    }}//如果一次循环中,没有进行数据交换,那么就说明序列已经有序。void BetterBubbleSort(int* a, int length){    if (a == NULL || length <= 0)        return;    int i, j, temp;    bool isChanged=false;    for (i = length - 1; i > 0; i--){        isChanged = false;        for (j = 0; j <i; j++){            if (a[j]>a[j + 1]){                temp = a[j];                a[j] = a[j + 1];                a[j + 1] = temp;                isChanged = true;            }        }        if (isChanged == false)            break;    }}//更好的冒泡排序,在一次冒泡排序中最后进行交换的位置为j,故我声明了一个last变量记录j,last<=i//然后进行循环时last~i之间的数据元素将为有序,last左边的数据将是无序区。void BestBubbleSort(int* a, int length){    if (a == NULL || length <= 0)        return;    int i, j, temp,last=0,m;    bool isChanged;    last = length - 1;    for (i = length - 1; i>0; i--){        isChanged = false;        m = last;        for (j = 0; j <m; j++)        {            if (a[j]>a[j + 1])            {                temp = a[j];                a[j] = a[j + 1];                a[j+1] = temp;                isChanged = true;                last = j;            }        }        if (isChanged == false)            break;    }}

 冒泡排序是一种稳定的排序方法,因为只有在大于后一个数的情况下才进行交换。冒泡排序最好情况比较次数为n-1,移动次数仅为0,此时数据元素本身就是有序序列。最坏情况下比较次数为n*(n-1)/2,移动次数为3n(n-1)/2,平均时间复杂度为O(n^2)。

冒泡排序