zoukankan      html  css  js  c++  java
  • 冒泡排序

     

    冒泡排序算法的原理如下: 

    1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
    2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
    3.针对所有的元素重复以上的步骤,除了最后一个。
    4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

    思路:依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。

       (1)第一次比较:首先比较第1个和第2个数,将小数放在前面,将大数放在后面。

       (2)比较第2和第3个数,将小数 放在前面,大数放在后面。

       ......

       (3)如此继续,知道比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成

       (4)在上面一趟比较完成后,最后一个数一定是数组中最大的一个数,所以在比较第二趟的时候,最后一个数是不参加比较的。

       (5)在第二趟比较完成后,倒数第二个数也一定是数组中倒数第二大数,所以在第三趟的比较中,最后两个数是不参与比较的。

       (6)依次类推,每一趟比较次数减少依次

    要排序数组:[8,3,2,5,1,7]
    第一趟排序:
    第1次排序:8和3比较,8大于3,交换位置 [3,8,2,5,1,7]
    第2次排序:8和2比较,8大于2,交换位置 [3,2,8,5,1,7]
    第3次排序:8和5比较,8大于5,交换位置 [3,2,5,8,1,7]
    第4次排序:8和1比较,8大于1,交换位置 [3,2,5,1,8,7]
    第5次排序:8和7比较,8大于7,交换位置 [3,2,5,1,7,8]
       
    第一趟总共进行了5次比较,排序结果:[3,2,5,1,7,8]

    第二趟排序:
    第1次排序:3和2比较,3大于2,交换位置 [2,3,5,1,7,8]
    第2次排序:3和5比较,3小于5,不交换位置 [2,3,5,1,7,8]
    第3次排序:5和1比较,5大于1,交换位置 [3,2,1,5,7,8]
    第4次排序:5和7比较,5小于7,不交换位置 [3,2,1,5,7,8]
       
    第二趟总共进行了4次比较,排序结果:[3,2,1,5,7,8]

    void MainWindow::bubbleSort(int *data, int len)
    {
        int temp;
        for(int i=0;i<len-1;i++)
        {
            for(int j=0;j<len-1-i;j++)
            {
                if(data[j]>data[j+1])
                {
                    temp=data[j];
                    data[j]=data[j+1];
                    data[j+1]=temp;
                }
    
            }       
        }
    }
    int my_array[6]={8,3,2,5,1,7};
            bubbleSort(my_array,6);
    
            for(int i=0;i<6;i++)
            {
                std::cout<<" "<<my_array[i];
            }
            std::cout<<std::endl;

    //输出 1 2 3 5 7 8

    最近看到一篇动画演示的,介绍的也比较详细:

    https://www.cnblogs.com/flydean/p/algorithm-bubble-sort.html

    C#实现

    int[] array = { 29, 10, 14, 37, 20, 25, 44, 15 };
    BubbleSort(array);
    
    private void BubbleSort(int[] array)
    {
        Console.WriteLine("排序前的数组为:" + ArrayToString(array));  
        //外层循环,遍历所有轮数
        for (int i = 0; i < array.Length - 1; i++)
        {
            //内层循环,两两比较,选中较大的数字,进行交换, 最后的i个数字已经排完序了,不需要再进行比较
            for (int j = 0; j < array.Length - i - 1; j++)
            {
                if (array[j] > array[j + 1])
                {
                    //交换两个数字
                    int temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                }
            }
            Console.WriteLine(""+i+"轮排序后的数组为:"+ArrayToString(array));
        }
    }
    
    private string ArrayToString(int[] array)
    {
        string str = "";
        for(int i=0;i<array.Length;i++)
        {
            str += array[i].ToString() + " ";
        }
        return str;
    }

    排序前的数组为:29 10 14 37 20 25 44 15
    第0轮排序后的数组为:10 14 29 20 25 37 15 44
    第1轮排序后的数组为:10 14 20 25 29 15 37 44
    第2轮排序后的数组为:10 14 20 25 15 29 37 44
    第3轮排序后的数组为:10 14 20 15 25 29 37 44
    第4轮排序后的数组为:10 14 15 20 25 29 37 44
    第5轮排序后的数组为:10 14 15 20 25 29 37 44
    第6轮排序后的数组为:10 14 15 20 25 29 37 44

  • 相关阅读:
    python字典的遍历
    python字典
    python可变对象
    python元组
    python的range()
    python遍历列表
    Kafka的知识总结(18个知识点)
    为什么fastjson字段为null时不输出空字符串?
    oracle建表字段包含关键字注意事项
    spring websocket 使用@SendToUser
  • 原文地址:https://www.cnblogs.com/ike_li/p/4287878.html
Copyright © 2011-2022 走看看