八大排序之冒泡排序;

Posted destiny-2015

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了八大排序之冒泡排序;相关的知识,希望对你有一定的参考价值。

/*八种排序之冒泡排序*/
//冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,
//就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。
/*  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。*/
/*双向链表过程:
1、从存储n个待排序元素的表尾开始,并令j=n;
2、若j<2,则排序结束;
3、从第一个元素开始进行两两比较,令i=1;
4、若i>=j,则一趟冒泡排序结束,j=j-1;待排序表的记录数-1,转step2;
5、比较array[i].key与array[i+1].key,若array[i].key<=array[i+1].key,则不交换,转step7;
6、array[i].key>array[i+1].key,将array[i].key于array[i+1].key交换;
7、i = i+1,转step4继续比较
*/

#include <stdio.h>
#define N 8
void BubbleSort(int array[N]) {
    for (int i = 1; i < N; i++)            //问题1、i为什么从1开始
                                       /*
                                       一共只需排N-1趟,最小的数字在最左边,不用排序;
                                       */
                                        //问题2、为什么只排序了N-1趟
                                        /*
                                        冒泡排序每趟需要将最大的数移动到最右边,
                                        (以max+下标表示这个数的大小排名,如最大的为MAX1)
                                        第一趟将数MAX1移动到底N-0个数的位置,
                                        第二趟将数MAX2移动到第N-1个数的位置
                                        第三趟将数MAX3移动到第N-2个数的位置
                                        ....
                                        第N-1趟将数MAX(n-1)移动到第N-((N-1)-1))==2个位置,
                                        此时仅剩下最小的数排在第一个位置,所以不用再排序了
                                        即一共排序了N-1趟;
                                        */
    {
        for (int j = 0; j < N - i; j++) {
                                        //问题3、j为什么等于N-i
                                         /*
                                         第i趟将数MAXi排在第N-(i-1)个位置上,而从第N-(i-1)往后
                                         的数字都已经排好序了,
                                         即后面的数字无需再排
                                         */
            if (array[j] > array[j + 1])
            {
                int t = array[j];
                array[j] = array[j + 1];
                array[j + 1] = t;

            }

        }
        printf("第%d趟排序", i);
        for (int a = 0; a < N; a++)
        {

            printf("%d ",array[a]);
        }

        printf(" ");
    }
}
int main() {
    int array[N];
    for (int i = 0; i < N; i++)
    {
        scanf("%d", &array[i]);
    }
    printf("排序前");
    for (int i = 0; i < N; i++)
    {
        printf("%d ", array[i]);
    }
    printf(" ");
    BubbleSort(array);
    printf("排序后 ");
    for (int i = 0; i < N; i++)
    {
        printf("%d ", array[i]);
    }
    return 0;
}
//实例:
//1,排序问题
//时间限制 : 1Sec 内存限制 : 128MB
//    题目描述
//    将四个整数进行从小到大的顺序排列,
//
//    输入
//    四个整数
//
//    输出
//    从小到大输出这四个数
//
//    样例输入
//    5 3 4 2
//    样例输出
//    2 3 4 5

#include <stdio.h>
#define N 4
void BubbleSort(int array[N]) {
    for (int i = 1; i < N; i++)
    {
        for (int j = 0; j < N - i;j++) {
            if (array[j]>array[j+1])
            {
                int t = array[j];
                array[j] = array[j + 1];
                array[j + 1] = t;
            }
        }
    }
    for (int i = 0; i < N; i++)
    {
        printf("%d ", array[i]);
    }    
}
void main() {
    int array[N];
    for (int i = 0; i < N; i++)
    {
        scanf("%d",&array[i]);
    }
    BubbleSort(array);
}

以上是关于八大排序之冒泡排序;的主要内容,如果未能解决你的问题,请参考以下文章

八大排序之冒泡排序

八大排序之冒泡排序;

20191209-八大排序之冒泡排序

《糊涂算法》之八大排序——冒泡排序

八大排序算法之五--交换排序—冒泡排序(Bubble Sort)

备战秋招之八大排序——O(n^2)级排序算法