初级系列8.冒泡排序

冒泡排序

问题描述

对N个整数(数据由键盘输入) 进行升序排列

问题分析

冒泡排序是在两个相邻元素之间进行比较交换的过程将一个无序表变成有序表

思想:从表头开始往后扫描数组,在扫描过程中逐对比较相邻两个元素的大小

​ 若相邻两个元素中,前面的元素大于后面的元素,则将它们互换,称之为

​ 消去一个逆序,在扫描过程中,不断将两相邻元素中的大者往后移动,最后就将

​ 数组中的最大者换到了表的最后,这正是数组中最大元素应有的位置,然后,在剩下的

​ 数组元素中(n-1个元素)重复上面的过程,将次小元素放到倒数第2个位置。不断重复上述过程

​ 直到剩下的数组元素为零为止,此时的数组就变为了有序

假设数组元素的个数为n,在最坏情况下需要的比较总次数为:((n-1) + (n-2) + .... + 2 + 1) = n(n-1)/2

算法设计

双层循环,第一层循环控制交换的轮数,第二层循环控制每轮需要交换的次数

/* !< use c */
#include <stdio.h>

#define N 3    /* !< 数组大小改变时只需要改变N对应的值不需要改动程序 */

int main(void)
{
    int i, j, a[N], t, count = 0;
    printf("为数组元素赋初值:\n");
    for (i = 0; i < N; i++) {
        scanf("%d", &a[i]);
    }
    for (i = 1; i <= N-1; i++) {        /* !<控制比较的轮数 */
        for (j = 0; j < N-i; j++) {     /* !<控制每轮比较的次数 */
            if (a[j] > a[j+1]) {        /* !<数组相邻两个元素进行交换 */
                t = a[j];
                a[j] = a[j+1];
                a[j+1] = t;
            }
        }
    }

    printf("经过交换后的数组元素为:\n");
    for (i = 0; i  < N; i++) {
        count++;
        printf("%d ", a[i]);
        if (count % 5 == 0) {       //控制每行输出5个数
            printf("\n");
        }
    }
    printf("\n");
}

posted @ 2019-09-08 10:08  电院院长  阅读(224)  评论(0编辑  收藏  举报