冒泡排序法vs快速排序法(c#)

Posted wanjinliu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒泡排序法vs快速排序法(c#)相关的知识,希望对你有一定的参考价值。

闲着没事,想思考一下两种排序法的直观对比,写了个小程序,代码如下,分析见后面:

class Program
    
        static DateTime t1, t2;
        static TimeSpan ts1,ts2;
        static int c1 = 0, c2 = 0;
        static void quick_sort(int[] a, int start, int end)
        
            int key, i, j, dir = -1;
            if (end <= start)
            
                return;
            
            i = start;
            key = a[i];
            j = end + 1;
            while (i < j)
            
                c1++;
                if (dir == -1)
                
                    if (a[--j] < key)
                    
                        a[i] = a[j];
                        dir = 1;
                    
                
                else
                
                    if (a[++i] > key)
                    
                        a[j] = a[i];
                        dir = -1;
                    
                
            
            a[i] = key;
            quick_sort(a, start, i - 1);
            quick_sort(a, i + 1, end);
        
        static void bubble_sort(int[] a, int start)
        
            int t;
            if(start==a.Length-1)
            
                return;
            
            for (int i = a.Length - 1; i >= start +1; i--)
            
                c2++;
                if (a[i - 1] > a[i])
                
                    t = a[i - 1];
                    a[i - 1] = a[i];
                    a[i] = t;
                
            
            bubble_sort(a, start + 1);
        

        static void Main(string[] args)
        
            int[] a,b;
            int length =100;
            a = new int[length*3];
            //init array
            for(int index=0,i=1,j=length+1,k= length*2+1; i<=length;i++,j++,k++)
            
                a[index++] = i;
                a[index++] = j;
                a[index++] = k;
            
            a.Reverse();
            b = new int[a.Length];
            a.CopyTo(b, 0);
            
            //bubble_sort start
            t1 = DateTime.Now;
            bubble_sort(b, 0);
            t2 = DateTime.Now;
            ts2 = t2.Subtract(t1);

            //quick_sort start
            t1 = DateTime.Now;
            quick_sort(a, 0, a.Length - 1);
            t2 = DateTime.Now;
            ts1 = t2.Subtract(t1);

           
            //output array
            ////Console.WriteLine("Array a:");
            ////foreach (var item in a)
            ////
            ////    Console.Write(item + " ");
            ////
            ////Console.WriteLine();
            ////Console.ReadKey();
            ////Console.WriteLine("Array b:");
            ////foreach (var item in b)
            ////
            ////    Console.Write(item + " ");
            ////
            ////Console.WriteLine();
            ////Console.ReadKey();
            Console.WriteLine($"Quick_sort spends ts1.Milliseconds ms.count=c1");
            Console.WriteLine($"Bubble_sort spends ts2.Milliseconds ms.count=c2");
            Console.ReadKey();
        
    

  

运行结果如图:

技术图片

想要看到更悬殊的差距,自行调大“int length =100;”的值就可以了。

简单地分析:

1、冒泡法对n个数排序,第一次比较n-1个,第二次比较n-2个,第三次比较n-3个。。。。以此类推。

2、快排对n个数排序,第一次比较n-1(分界数0,参照数1)个,第二次比较n-3(分界数1,参照数2)个,第三次比较n-7(分界数3,参照数4)个,第四次比较n-15(分界数7,参照数8)。。。。以此类推

(每次比较都会去掉分界点的那个数字和每组中的一个数字,而组数是按2的n次方增加的)

仅考虑比较多次数,快排完胜。

以上是关于冒泡排序法vs快速排序法(c#)的主要内容,如果未能解决你的问题,请参考以下文章

php排序介绍_冒泡排序_选择排序法_插入排序法_快速排序法

C#冒泡排序法及优化

js冒泡排序法——选择排序(other)——计数排序(桶排序)——快速排序——插入排序-更新

快速排序法

C#冒泡排序法

冒泡排序法