八大排序算法——冒泡排序

冒泡排序

冒泡排序,顾名思义,它是将关键字按照你想要的序列一个一个“冒”出来,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。
假设我们待排序的数组是a[6]={8,9,1,3,5,7},所要求的序列是升序,那么如下图,算法的第一次冒泡是先将最大关键字9“冒”到末置位。其过程:先将8和9比较,8<9不交换;再将9和1比较,9>1交换;然后将9和3比较,9>3交换,以此类推,关键字9就被交换到了最后一位。从图中可以分析出,第一次冒泡我们交换了5次,也就是n-1次(n为数组下标,也就是关键字个数),那最后一位已经是最大关键字了,第二次冒泡我们就不用再去比较它了,所以第二次冒泡我们只需要比较4次,也就是n-2次。由此可知,第一次冒泡比较的次数为n-1次,其后每一次冒泡我们所要比较的次数是上一次冒泡比较的次数-1,这是一个循环递减的过程。
那么我们到底需要冒泡几次才能得到想要的序列呢,很明显,当我们不需要再比较也就是比较次数为0的时候,就不需要再进行冒泡了,也就是说我们需要冒泡5次,即n-1次。
这里写图片描述
代码如下:

void BubbleSort(int a[],int length)
{
    int i,j;
    for(i=1;i<length;i++)
    {
        for(j=0;j<=length-i-1;j++)
        {
            if(n[j]>n[j+1])
            {
                n[j]=n[j]^n[j+1];
                n[j+1]=n[j]^n[j+1];
                n[j]=n[j]^n[j+1];
            }
        }
    }
}

冒泡排序的优化

这样的冒泡是否还能继续优化呢?答案是肯定的,试想一下,如果我们待排序的数组是a[6]={2,1,3,4,5,6},也就是说,除了a[0]和a[1]需要交换外,其他都不需要交换。如果我们还像上述方法进行冒泡,会有大部分的操作是没有必要的,这时候我们可以增加一个标记变量change来实现这一算法的改进。当某一层冒泡并没有关键字的交换时,意味这序列已经满足要求,这时change不会被置1,循环终止。

void BubbleSort(int a[])
{
    int n=sizeof(a)/sizeof(int);
    int i,j;
    int change=1;
    for(i=1;i<n && change;i++)
    {
        change=0;
        for(j=0;j<=n-i-1;j++)
        {
            if(n[j]>n[j+1])
            {
                n[j]=n[j]^n[j+1];
                n[j+1]=n[j]^n[j+1];
                n[j]=n[j]^n[j+1];
                change=1;
            }
        }
    }
}

注:冒泡算法的时间复杂度为O(n^2)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章