常用排序算法归纳(1)——冒泡排序

一、概念:

冒泡排序,是对桶排序改进的一种排序,不仅解决了浪费空间的问题,而且还可以进行浮点数的比较和输出一些必要的信息,容易实现由小到大(由大到小)的一种排序方法。

二、算法思路

    1、每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来;

    2、用两层for循环进行比较:1>外层循环控制轮数;

                               2>内层循环实现数的两两比较。

说明:如果有N个数,则要进行N-1轮比较。在第一轮比较中要进行N-1次两两比较,在第j轮比较中进行N-j次两两比较。

三、图解:

说明:用冒泡排序实现下面5个数由大到小排序。

原始数据:

    34         67         90         43         124  

第一轮:

       124     |     124    |   124    |    124     |   34

       43       |     43      |   43      |    34      |   124

       90       |     90      |   34      |    43      |    43

       67       |     34      |   90      |    90      |    90

       34       |     67      |   67      |    67      |    67

解析:

1、形象直观地看出,最小的数在这一轮的比较中不断上升一位,直到升到最后一位。就如同是一个气泡,一步一步往后“翻滚”,直到最后一位。所以这个排序的方法有一个很好听的名字“冒泡排序”。

2、在这一轮中进行了4次两两比较(N-1次比较)。

第一轮排序后: 67    90    43    124    34

在接下来的几轮的比较中与第一轮的比较方法相同

第二轮排序后: 90    67    124    43    34

第三轮排序后: 90    124    67    43    34

第四轮排序后: 124    90    67    43    34

四、代码实现:

#include <stdio.h>

# define N 5

void print_arry(int *a,int len)
{
    int i;
    for(i = 0;i < len;i++)
    {
        printf("%d ",*(a+i));
    }
    printf("\n");
}

void bubble_sort(int *a,int len)
{
    int i,j,n,temp;

    for(i = 0;i < len-1;i++)
    {
        for(j = 0;j < len-1-i;j++)
        {
            if(a[j] < a[j+1])
            {
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }
        for(n = 0;n < len;n++)           //打印排序过程
        {
            printf("%d ",a[n]);
        }
        printf("\n");
        getch();
    }
}

int main()
{
    int a[N] = {34,67,90,43,124};
    int i;
    printf("原数组\n");
    print_arry(a,sizeof(a)/sizeof(a[0]));
    printf("排序过程\n");
    bubble_sort(a,sizeof(a)/sizeof(a[0]));
    printf("排序后\n");
    print_arry(a,sizeof(a)/sizeof(a[0]));

    return 0;
}



五、复杂度:

时间复杂度:O(n² ),最好的情况下是O(n );

空间复杂度:O(1)。




猜你喜欢

转载自blog.csdn.net/buknow/article/details/80473620
今日推荐