• 【Algorithm】冒泡排序


    一. 算法描述

      冒泡排序思想:依次比较相邻的数据,将小数据放在前,大数据放在后;即第一趟先比较第1个和第2个数,大数在后,小数在前,再比较第2个数与第3个数,大数在后,小数在前,以此类推则将最大的数"滚动"到最后一个位置;第二趟则将次大的数滚动到倒数第二个位置......第n-1(n为无序数据的个数)趟即能完成排序。

      举个例子:5 7 9 3 6 2 8

      第一趟: 5 7 9 3 6 2 8    第二趟:5 7 3 6 2 8 9    第三趟:3 5 6 2 7 8 9

           5 7 9 3 6 2 8        5 3 7 6 2 8 9        ........

           5 7 3 9 6 2 8        5 3 6 7 2 8 9

           5 7 3 6 9 2 8        5 3 6 2 7 8 9

           5 7 3 6 2 9 8        5 3 6 2 7 8 9

           5 7 3 6 2 8 9 

    二. 算法实现

    #include<stdio.h>
    
    /*
    * author:Knife
    * time:2014.06.12 20:56
    */
    void main_bubbleSort1(){
        int intArr[] = {8,3,6,4,2,9,5,4,1,7};
        int n = sizeof(intArr)/sizeof(intArr[0]); // 计算整型数组的长度
        int i,j,tmp;
        //冒泡排序
        for(i = 0; i < n; i++){
            for(j = 0; j<n-i-1; j++){
                if(intArr[j]>intArr[j+1]){
                    tmp = intArr[j+1];
                    intArr[j+1] = intArr[j];
                    intArr[j] = tmp;
                }
            }
        }
        //输出
        for(i = 0; i < n; i++){
            printf("%d ",intArr[i]);
        }
        printf("
    ");
    }

    三. 算法分析

    •   平均时间复杂度:O(n^2)
    •   空间复杂度:O(1)  (用于交换)
    •   稳定性:稳定

    四. 算法优化

      优化思路还可以对冒泡排序算法进行简单的优化,用一个标记来记录在一趟的比较过程中是否存在交换,如果不存在交换则整个数组已经有序退出排序过程,反之则继续进行下一趟的比较。

    #include<stdio.h>
    
    void main(){
        void DataSwap(int* data1, int* data2);
        void BubbleSort(int* pDataArray, int iDataNum);
    
        int intArr[] = {8,3,6,4,2,9,5,4,1,7};
        int n = sizeof(intArr)/sizeof(intArr[0]); // 计算整型数组的长度
    
        BubbleSort(intArr, n);
    
        //输出
        for(int i = 0; i < n; i++){
            printf("%d ",intArr[i]);
        }
        printf("
    ");
    }
    
    //交换data1和data2所指向的整形
    void DataSwap(int* data1, int* data2)
    {
        int temp = *data1;
        *data1 = *data2;
        *data2 = temp;
    }
    
    /********************************************************
    *函数名称:BubbleSort
    *参数说明:pDataArray 无序数组;
    *           iDataNum为无序数据个数
    *说明:    冒泡排序
    *********************************************************/
    void BubbleSort(int* pDataArray, int iDataNum)
    {
        bool flag = false;    //记录是否存在交换
        for (int i = 0; i < iDataNum - 1; i++){    //走iDataNum-1趟
            flag = false;
            for (int j = 0; j < iDataNum - i - 1; j++){    
                if (pDataArray[j] > pDataArray[j + 1]){
                    flag = true;
                    DataSwap(&pDataArray[j], &pDataArray[j + 1]);
                }
            }
            if (!flag){    //上一趟比较中不存在交换,则退出排序
                break;
            }
        }
    }

    参考资料

    [1] http://blog.csdn.net/cjf_iceking/article/details/7911027

  • 相关阅读:
    centos 下PATH变量配置错误补救办法 Alex
    基于php模块方式安装LAMP和常见LAMP应用 Alex
    php配置 Alex
    php测试小代码 Alex
    PHP简介 Alex
    2.7.JavaScriptnull与undefined
    2.9.JavaScript内置对象
    2.8.JavaScript不同数据类型转换
    2.2.javascript变量作用域
    2.6.Javascript数值型
  • 原文地址:https://www.cnblogs.com/ningvsban/p/3784735.html
Copyright © 2020-2023  润新知