zoukankan      html  css  js  c++  java
  • C语言:冒泡排序

    1.基本思想

    冒泡排序:两两比较相邻记录的关键码,如果反序则交换,直到没有反序记录为止

    2.排序过程(升序)

    ①、将整个待排序的记录序列分成有序区和无序区,初始时有序区为空,无序区包括所有待排序的记录
    ②、对无序区从前向后依次将相邻记录的关键码进行比较,若反序则交换,从而使得关键码小的记录向前移,关键码大的向后移(像水中的气泡,体积大的先浮起来)
    ③、重复执行②。直到无序区中没有反序的记录

    初始键值序列  [50 13  55  97  27  38  49  65]
    一轮排序结果  [13 50  55  27  38  49  65] 97
    二轮排序结果  [13 50  27  38  49] 55  65  97
    三轮排序结果  [13 27  38  49] 50  55  65  97
    四轮排序结果  13  27  38  49  50  55  65  97

    3.需要解决的问题

    ①、在一轮冒泡排序中,若有多个记录位于最终位,应该如何记录

    为此,设置变量exchange记录每次元素交换的位置,则一轮排序后,exchange记录的一定是这轮排序中 元素最后一次交换的位置,从此位置之后的所有元素都是已经有序的了
    
    算法
    if(args[r]>args[r+1]){
        temp=args[r];
        args[r]=args[r+1];
        args[r+1]=temp;
        exchange=r+1;
    }

    ②、如何确定冒泡排序范围,使得已经位于最终位置的元素不参与下一轮排序

    设置变量bound记录的是无序区的最后一个元素的索引,则每一轮排序的范围是args[0]~~~args[bound]
    
    算法:
    for(j=0;j<=bound-1;j++){
        if(args[j]>args[j+1]){
        temp=args[j];
        args[j]=args[j+1];
        args[j+1]=temp;
        exchange=j+1;
    }
    }

    ③、如何判别冒泡排序结束

    判别结束条件应该是 在一轮排序过程中没有进行元素的交换,那么说明排序完成了。因此,在每一轮排序之前设置exchange=0,在这一轮的排序中,只要有元素的交换,那么exchange的是一定大于0。

    4.算法实现

    #include<stdio.h>
    
    void BubbleSort(int *arg, int length);
    void PrintArray(int *arg, int length);
    
    void BubbleSort(int *args, int length){
        int j=0,bound=0,count=0;
        int exchange= length-1; 
        int temp=0;
        //原始数组
        PrintArray(args,length);
    
        while (exchange != 0){
    
            bound = exchange;
            exchange = 0;
    
            for (j = 0; j <=(bound-1); j++){
                ///两个相邻数对比,并进行交换
                if (args[j]>args[j + 1]){
                    temp = args[j];
                    args[j] = args[j + 1];
                    args[j + 1] = temp;
                    //有了交换这个exchange的值才会改变
                    exchange = j+1;
                }
                }   
                printf("%d:", ++count);//第几轮
                PrintArray(args,length);//打印一轮后的结果
            }
    }
    
    
    void PrintArray(int *args, int length){
        int i = 0, j = 0;
        printf("[");
        for (i = 0; i < length; i++){
            printf("%d,", args[i]);
        }
        printf("]
    ");
    }
    
    
    int main(void){
        int args[] = { 50,13,55,97,27,38,49,65 };
        BubbleSort(args, 8);
    
        return 0;
    }
    
    
    ***********OutPut**********
    [50,13,55,97,27,38,49,65,]
    1:[13,50,55,27,38,49,65,97,]
    2:[13,50,27,38,49,55,65,97,]
    3:[13,27,38,49,50,55,65,97,]
    4:[13,27,38,49,50,55,65,97,]
    请按任意键继续. . .
    
  • 相关阅读:
    百度之星 预赛002 大数问题+斐波那契数列
    L2-005. 集合相似度
    L2-008. 最长对称子串 (有个知识点没看)
    L1-1. 这是一道简单题
    L1-3. 这道真是简单题
    java实现的加密解密
    应用实现国际化的做法
    SAX解析器
    JFrame绝对布局
    配置Tomcat启用Https安全协议的访问
  • 原文地址:https://www.cnblogs.com/cmustard/p/6769932.html
Copyright © 2011-2022 走看看