浅谈算法之冒泡排序

本文深入探讨了冒泡排序的基本原理,详细解释了如何通过比较相邻元素并交换位置来逐步排序数组。此外,还提供了用C#语言实现冒泡排序的示例代码,帮助读者更好地理解和应用该算法。
摘要由CSDN通过智能技术生成
前言:
冒泡排序是交换排序的一种,通过C#代码实现来理解冒泡的思想。
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
形象图:
                               
例:
已知一组无序数据a[1]、a[2]、……a[n],需将其按 升序 (从小到大)排列。
1.首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。
2.然后继续比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变,以此类推。
3.最后比较a[n-1]与a[n]的值。这样处理一轮后,a[n]的值一定是这组数据中最大的。
4.再对a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。
5.再对a[1]~a[n-2]以相同方法处理一轮,以此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。
*降序排列与升序排列相类似,若a[1]小于a[2]则交换两者的值,否则不变,后面以此类推。 
总的来讲,每一轮排序后最大(或最小)的数将移动到数据序列的最后,理论上总共要进行 n(n-1)/2次 交换。

代码实现:

static void Main(string[] args)
        {

            int[] nums = new int[] { 9, 8, 7, 6, 5, 4, 3, 2, 1 };
            //定义一个Int 数组进行存放待排序的数
            int temp = 0;
            //定义一个值为0的变量

            for (int j = 0;j< nums.Length -1; j++)//外循环
            {
                for (int i = 0; i < nums.Length-1-j; i++)//内循环
                {
                    if (nums[i] > nums[i + 1])//如果两个数比较,后一个比前一个大
                    {
                        temp = nums [i];
                        nums[i] = nums[i+ 1];
                        nums[i+1] = temp;
                        //通过第三变量来交换值
                    }
                }
            }
            for (int i = 0; i <nums.Length ; i++)
            {
                Console.WriteLine(nums[i]+"\t");
            }
            //循环输出经过排序的数
            Console.ReadKey();

        }


小结:
这里采用的是为整型数组添加扩展方法实现的冒泡排序。
优点: 稳定
缺点: 慢,每次只移动相邻的两个元素。
时间复杂度:理想情况下(数组本来就是有序的),此时最好的时间复杂度为 o(n) ,最坏的时间复杂度(数据反序的),此时的时间复杂度为o(n*n) 。冒泡排序的平均时间负责度为o(n*n).

评论 89
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Adam`南帝·梁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值