29. 排序算法(2):冒泡排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dugudaibo/article/details/79466380

1. 直观的想法

  一个直观的想法是从第一个位置开始,用这个位置的元素与后面的每一个元素进行比较,如果后面的数字比这个数字小的话,就将它调换到前面,具体过程如下图所示的初始数组

相当于将第一个位置的元素与之后的每一个元素进行比较,选出最小的最为第一个位置的元素。具体来说,首先 5 比 2 大,将 2 ,5 的位置互换。

  之后 2 比 6 小不用动,而 2 比 0 小,所以 2 , 0 再一次互换,就这样一直找到下标为 0 的元素,然后使用同样的方法找到下标为 1 的最小值,当确定最后一个下标所对应的元素之后,排序就完成了。

  具体如下代码

#include <stdio.h>

void BubbleSort(int k[], int n)
{
    int i, j, temp, count1=0, count2=0;

    for( i=0; i < n-1; i++ )
    {
        for( j=i+1; j < n; j++ )
        {
            count1++;
            if( k[i] > k[j] )
            {
                count2++;
                temp = k[j];
                k[j] = k[i];
                k[i] = temp;
            }
        }
    }
    printf("总共进行了%d次比较,进行了%d次移动!", count1, count2);
}

int main()
{
    int i, a[10] = {1, 0, 2, 3, 4, 5, 6, 7, 8, 9};

    BubbleSort(a, 10);

    printf("排序后的结果是:");
    for( i=0; i < 10; i++ )
    {
        printf("%d", a[i]);
    }
    printf("\n\n");

    return 0;
}

2. 冒泡算法

  冒泡排序的基本思想:两两相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。两两注意是相邻的两个元素的意思。如果有n个元素需要比较n-1次,每一轮减少1次比较。既然叫冒泡排序,那就是从下往上两两比较,所以看上去就跟泡泡往上冒一样。

  举一个具体的例子,假如原始的数组如下所示

冒泡法实际上是从大到小开始比较,当 i = 0 的时候确定的是最上面的元素(即最小的元素),从下向上数组两两比较,如果下面的数比上面的数小则互换两个数的位置,那么 0 是比剩下的所有的数都要小的,所以最后一定会到最上面,因此最小的数字会最先到上面浮出来,所以形象地称之为冒泡法。

  具体如下代码

#include <stdio.h>

void BubbleSort(int k[], int n)
{
    int i, j, temp, count1=0, count2=0;

    for( i=0; i < n-1; i++ )
    {
        for( j=n-1; j > i; j-- )
        {
            count1++;
            if( k[j-1] > k[j] )
            {
                count2++;
                temp = k[j-1];
                k[j-1] = k[j];
                k[j] = temp;
            }
        }
    }

    printf("总共进行了%d次比较,进行了%d次移动!", count1, count2);
}

int main()
{
    int i, a[10] = {5, 2, 6, 0, 3, 9, 1, 7, 4, 8};

    BubbleSort(a, 10);

    printf("排序后的结果是:");
    for( i=0; i < 10; i++ )
    {
        printf("%d", a[i]);
    }
    printf("\n\n");

    return 0;
}

3. 冒泡算法的改进

  冒泡算法可以进行一些改进,比如说当遇到如下的情况

如果 0,1 互换了位置之后,当 i = 1 的时候,执行了一次比较之后,没有发生调换证明顺序已经顺序定好了,就不用执行下面的操作了。

#include <stdio.h>

void BubbleSort(int k[], int n)
{
    int i, j, temp, count1=0, count2=0, flag;

    flag = 1;
    for( i=0; i < n-1 && flag; i++ )
    {
        for( j=n-1; j > i; j-- )
        {
            count1++;
            flag = 0;
            if( k[j-1] > k[j] )
            {
                count2++;
                temp = k[j-1];
                k[j-1] = k[j];
                k[j] = temp;
                flag = 1;          //如果在一次循环中没有执行过互换数值,证明排序已经完成,就不会使 flag = 1;
            }
        }
    }

    printf("总共进行了%d次比较,进行了%d次移动!", count1, count2);
}

int main()
{
    int i, a[10] = {5, 2, 6, 0, 3, 9, 1, 7, 4, 8};

    BubbleSort(a, 10);

    printf("排序后的结果是:");
    for( i=0; i < 10; i++ )
    {
        printf("%d", a[i]);
    }
    printf("\n\n");

    return 0;
}

猜你喜欢

转载自blog.csdn.net/dugudaibo/article/details/79466380
今日推荐