回顾排序算法之冒泡排序

       虽然现在用自己写排序算法的机会很少,都是调用已经被封装好的方法,但是还是想回顾一下排序算法的思想:

排序算法基本有几类 先回顾一下冒泡排序

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法

它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名“冒泡排序”。
冒泡排序算法的原理如下:
  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较

冒泡排序(从小到大)

    数组排序例子解析 

    int[] arr = {43,23,44,555,22}

    比较第一轮(目标数组{43,23,44,555,22}):

                        43>23 换位置 结果是{23,43,44,555,22}

                        43<44 不用换位置 结果{23,43,44,555,22}

                        44<555 不用换位置 结果{23,43,44,555,22}

                        555>22换位置 结果是{23,43,44,22,555}

                        第一轮比较了4次,结果是将最大的值555放在了数组最后位置。

    比较第二轮(目标数组{23,43,44,22}):

                        23<43不用换位置 结果{23,43,44,22}

                        43<44不用换位置 结果{23,43,44,22}

                        44>22换位置 结果是{23,43,22,44}

                        第二轮比较了3次,结果是将最大的值44放在了目标数组最后位置。

    比较第三轮(目标数组{23,43,22}):

                        23<43不用换位置 结果{23,43,22}

                        43>22换位置 结果{23,22,43}

                        第三轮比较了2次,结果是将最大的值43放在了目标数组最后位置。

    比较第四轮(目标数组{23,22}):

                        23>22换位置 结果{22,23}

                        第四轮比较了1次,结果是将最大的值23放在了目标数组最后位置。

    经过四轮比较久剩下一个数22因此就不用比较了,最终结果就是

    {22,23,43,44,555}

代码书写:

通过上面的例子可知,一共比较了4轮,分析得知比较的轮数是总长度减一的次数,所以需要一个for循环控制比较轮数

for(int i=0; i<arr.length-1; i++)

每一轮比较都会比较上一轮剩下的数据 比较的次数是数组总长度减一减去之前的轮数,所以还需要一个for循环控制比较次数

for(int j=0; j<arr.length-1-i;j++)

所有代码可以这样写

    int temp=0;

    for(int i=0; i<arr.length-1; i++){

        for(int j=0; j<arr.length-1-i;j++){

            if(arr[j]>arr[j+1]){

                temp= arr[j+1];

                arr[j+1] = arr[j];

                arr[j] = temp;

}

}

}

法稳定性

  1. 冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法比较

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值