冒泡排序和改进的冒泡排序的性能差距

若记录序列的初始状态为“正序”,则冒泡排序过程只需进行一趟排序,在排序过程中只需进行n-1次比较,且不移动记录;反之,若记录序列的初始状态为“逆序”,则需进行n(n-1)/2次比较和记录移动。因此冒泡排序总的时间复杂度为O(n*n)。
下面我们编写一个测试程序,随机生成1000组每组为10个元素的数组,对其采用冒泡排序算法和改进的冒泡排序算法分别进行排序。最后我们看一下两种算法之间的差距。测试程序的源代码如下:


using System;
class Program
{
    static void Main(string[] args)
    {
        //冒泡排序 循环总共执行次数
        int BubbleSortCount = 0;
        //改进的冒泡排序 循环总共执行次数
        int ImprovedBubbleSortCount = 0;
        //冒泡排序所需的临时变量
        int temp;
        //一个交错二维数组,用于保存测试数据
        int[][] arr2 = new int[1000][];
        //创建一个随机类,用于生成随机测试数据
        Random r = new Random();
        //通过嵌套的for循环,使用上面的随机数对象生成随机测试数据
        for (int i = 0; i < arr2.Length; i++)
        {
            //新建一个一维数组
            int[] arr = new int[10];
            for (int j = 0; j < arr.Length; j++)
            {
                //通过调用随机类对象 r 的Next方法,随机生成1000以内的测试数据
                arr[j] = r.Next(1000);
            }
            //将包含测试数据的一维数组作为二维数组的元素
            arr2[i] = arr;
        }
        //另外保存一份相同的测试数据,用于测试改进的冒泡排序算法效率
        int[][] ImprovedArr2 = new int[1000][];
        for (int i = 0; i < arr2.Length; i++)
        {
            ImprovedArr2[i] = new int[10];
            arr2[i].CopyTo(ImprovedArr2[i], 0);
        }
        //针对二维数组的每个一维数组元素进行冒泡排序,也就是说测试冒泡排序1000次
        for (int h = 0; h < arr2.Length; h++)
        {
            //冒泡排序
            for (int i = 1; i < arr2[h].Length; i++)
            {
                for (int j = 0; j < arr2[h].Length - 1; j++)
                {
                    if (arr2[h][j] > arr2[h][j + 1])  //将每相邻的两个数相比
                    {
                        temp = arr2[h][j];
                        arr2[h][j] = arr2[h][j + 1];
                        arr2[h][j + 1] = temp;
                    }
                }
                //记录每一轮排序
                BubbleSortCount++;
            }
        }
        Console.WriteLine("对1000个长度为10的随机数组使用【冒泡排序算法】排序总次数:/t" + BubbleSortCount);

        //针对二维数组的每个一维数组元素进行【改进的冒泡排序】,也就是说测试【改进的冒泡排序】1000次
        bool flag = true;
        for (int h = 0; h < ImprovedArr2.Length; h++)
        {
            //使用改进的冒泡排序进行测试
            for (int i = 1; i < ImprovedArr2[h].Length; i++)
            {
                //每轮排序结束后都复位标识位
                flag = true;
                for (int j = 0; j < ImprovedArr2[h].Length - 1; j++)
                {
                    //将每相邻的两个数相比
                    if (ImprovedArr2[h][j] > ImprovedArr2[h][j + 1]) 
                    {
                        temp = ImprovedArr2[h][j];
                        ImprovedArr2[h][j] = ImprovedArr2[h][j + 1];
                        ImprovedArr2[h][j + 1] = temp;

                        flag = false;
                    }
                }
                ImprovedBubbleSortCount++;
                if (flag)
                    break;
            }
        }
        Console.WriteLine("对1000个长度为10的随机数组使用【改进的冒泡排序算法】排序总次数:/t" + ImprovedBubbleSortCount);
    }

 

运行结果:

对1000个长度为10的随机数组使用【冒泡排序算法】排序总次数:      9000
对1000个长度为10的随机数组使用【改进的冒泡排序算法】排序总次数:        7368
请按任意键继续. . .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值