秒懂算法1——冒泡排序,及一种小改进(C#实现)

算法思路:

重复走访每两个相邻元素,比较大小交换位置,直至排序完成。

有兴趣电话可以看一下这个【冒泡排序踢踏舞】的视频,很形象的演示了排序过程,额呵呵~~

性质:

冒泡排序是一种原地排序(只有常数个元素存到数组以外的空间),最坏的时间复杂度,和平均时间复杂度都是n2。冒泡法是稳定的

*注: 

冒泡排序是算法入门级别,是面试笔试时候的禁术,古往今来死在冒泡法上的应届生真可谓前仆后继...

代码:

int[] BubbleSort1(int[] a)
        {
            int num; 
            for (int i = a.Length-1; i>0; i--) //外层循环,每一轮把最大的元素换到最后,下一轮少排一个元素
                 {
                     for (int j = 0; j < i; j++) 
                     {
                         if (a[j] > a[j + 1])
                         { num = a[j]; a[j] = a[j + 1]; a[j + 1] = num; }
                     }

                 }

            return a;
        }

改进:

因为冒泡法会机械而重复的完成所有比较,比如对{10,1,2,3,4,5,6}这个数组的排序,实际上第一轮过后,就已经排好了,但程序还是把没有意义的比较进行到底。。。

于是可以加一个开关变量,在某一轮没有发生交换的情况下,结束排序,如下:

int[] BubbleSort2(int[] a)
        {
            int num; 
            for (int i = a.Length-1; i>0; i--)
                 {
                     bool isOver=true;
                     for (int j = 0; j < i; j++) 
                     {
                         if (a[j] > a[j + 1])
                         {
                                num = a[j]; a[j] = a[j + 1]; a[j + 1] = num; 
                                isOver = false ;
                         }
                     }
                     if (isOver) break;    //没有发生交换则结束
                 }

            return a;
        }              
原文地址:https://www.cnblogs.com/hydor/p/3529152.html