冒泡排序

 

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

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

原文地址:https://www.cnblogs.com/ike_li/p/4287878.html