zoukankan      html  css  js  c++  java
  • 八大排序之冒泡排序;

    /*八种排序之冒泡排序*/
    //冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,
    //就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。
    /*  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继续比较
    */


    //问题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趟;
    */
    //问题3、j为什么小于N-i
    /*
    第i趟将数MAXi排在第N-(i-1)个位置上,而从第N-(i-1)往后
    的数字都已经排好序了,
    即后面的数字无需再排
    */
    #include <stdio.h>
    #define N 8

    void BubbleSort(int array[N]) {
        for (int i = 1; i < N; i++)   //问题1  、问题2      
        {
            for (int j = 0; j < N - i; j++) {    //问题3、    
        
                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 //实例:
     2 //1,排序问题
     3 //时间限制 : 1Sec 内存限制 : 128MB
     4 //    题目描述
     5 //    将四个整数进行从小到大的顺序排列,
     6 //
     7 //    输入
     8 //    四个整数
     9 //
    10 //    输出
    11 //    从小到大输出这四个数
    12 //
    13 //    样例输入
    14 //    5 3 4 2
    15 //    样例输出
    16 //    2 3 4 5
    17 
    18 #include <stdio.h>
    19 #define N 4
    20 void BubbleSort(int array[N]) {
    21     for (int i = 1; i < N; i++)
    22     {
    23         for (int j = 0; j < N - i; j++) {
    24             if (array[j]>array[j + 1])
    25             {
    26                 int t = array[j];
    27                 array[j] = array[j + 1];
    28                 array[j + 1] = t;
    29             }
    30         }
    31     }
    32     for (int i = 0; i < N; i++)
    33     {
    34         printf("%d ", array[i]);
    35     }
    36 }
    37 void main() {
    38     int array[N];
    39     for (int i = 0; i < N; i++)
    40     {
    41         scanf("%d", &array[i]);
    42     }
    43     BubbleSort(array);
    44 }

      

    冒泡排序的核心部分是双重嵌套循环,冒泡排序的时间复杂度是O(N2),时间复杂度较高,但程序理解难度相对较简单,并不推荐使用冒泡排序;

  • 相关阅读:
    go语言的垮平台编译
    vscode使用技巧
    集合
    泛型
    异常
    Java垃圾回收机制
    java学习笔记9.20
    java变量类型
    目前的学习计划
    离第一篇博客三天
  • 原文地址:https://www.cnblogs.com/destiny-2015/p/11784158.html
Copyright © 2011-2022 走看看