排序算法-冒泡排序

冒泡排序(Bubble Sort),是一种最基础的交换排序。之所以叫做冒泡排序,因为每一个元素都可以像小气泡一样,根据自身大小一点一点向数组的一侧移动。

一、冒泡排序基本原理

假设长度为n的数组arr,要按照从小到大排序。每轮从第一个数开始到数组最后一个元素为止,依次与后面的数两两比较大小,若满足条件则交换位置。即每轮最右端的元素即为当前轮次最大值。接着对该数组除最右端的n-1个元素进行同样的操作,再接着对剩下的n-2个元素做同样的操作,直到整个数组有序排列。

动画示例:

二、实现代码

1.标准实现

将一列数从左到右从小到大排列。

代码如下(示例):

private static int[] BUbbleSortPractice(int[] array)
        {
            for(int i = 0; i < array.Length; ++i)//有多少个数进行多少轮
            {
                for (int j = 0; j < array.Length - 1 - i; ++j)//从第一个数开始依次比较
                {
                    if (array[j] > array[j + 1])//满足条件交换位置
                    {
                        int temp = array[j];
                        array[j] = array[j + 1];
                        array[j+1] = temp;
                    }
                }
            }
            return array;
        }

注意:

1.array.Length - 1是因为当array[j]为最后一个数时无法与下一个数比较

2.array.Length - 1 - i ,i是轮次数,因为每进行一轮都有一个极值放在最后,经过i轮后,第i个数已经是极值了,不需要比较。

2.优化过程

若进行一定轮次之后已经为最终结果则无需继续比较排序。

代码如下(示例):

private static int[] BubbleSort(int[] array)
        {
            bool isSort = false;//判断是否进行比较换位
            for (int i = 0; i < array.Length; i++)
            {
                isSort = false;
                for (int j = 0; j < array.Length-1-i; j++)//-i是因为每进行一轮最后一个已是极值不需要比较换位
                {
                    if (array[j]>array[j+1])
                    {
                        isSort = true;//交换 改变真值
                        int temp = array[j];
                        array[j] = array[j + 1];
                        array[j + 1] = temp;
                    }
                }
                if (!isSort)//如果isSort为false则没交换,即最终结果
                {
                    break;
                }
                //isSort作用:如果第四轮已为最终结果则无需比较排序
            }
            return array;
        }

# 总结

选择排序关键点:

两层循环,外循环代表有多少个数进行多少轮,内循环是依次比较大小满足条件则交换位置。

在比较交换操作过程中,如果第一个元素大于第二个元素,我们才交换两个元素,两个元素相等时,保持不变。所以两个相等的元素在排序前后的相对位置并不会发生变化,所以冒泡排序是稳定排序算法。

时间复杂度:最坏情况:O(N^2)

      最好情况:O(N)

空间复杂度:O(1)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值