大话排序算法(一)-- 冒泡排序

前言

排序算法事很重要的算法之一,几乎是Java的面试必问题了,在此通过几篇博文,总结一下几种常见的排序算法。当然这只是其中的几个。

排序算法可以分为内部排序和外部排序。

  • 外部排序通常是读数据量很大的数据进行排序,且因为需要排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。
  • 内部排序需要排序的数据量相对较小。是将需要排序的数据记录在内存中进行排序。

博文链接:(点击排序名称可看到不同排序的博文。不断更新中…)
  常见的内部排序算法有:冒泡排序选择排序插入排序希尔排序快速排序
几种排序的比较:

排序算法时间复杂度空间复杂度稳定性
冒泡排序O(n2)O(1)稳定
选择排序O(n2)O(1)不稳定
插入排序O(n2)O(1)稳定
快速排序O(n logn)O(log n)不稳定
归并排序O(n logn)O(n)稳定
希尔排序O(n logn)O(1)稳定

冒泡排序

  1. 排序方式
    从第一个数字起,依次比较相邻的两个数字,如果他们的顺序不符合要求,就将两个数字的顺序交换。这个过程是重复循环进行的,直到所有的数字都按照要求排好顺序。

  2. 排序讲解
    例如对:6 5 3 4 9 进行从小到大排序。具体的过程为:
    第一次外循环:
    用第一个数字6作为第一轮的开始,依次比较相邻的数字。

    • 第一次内循环:第一个数字和第二个数字比较,于是6和5相比,5小,交换6和5的顺序,顺序变为:5 6 3 4 9
    • 第二次内循环:第二个数字和第三个数字比较,于是6和3相比,3小,交换6和3的顺序,顺序变为:5 3 6 4 9
    • 第三次内循环:第三个数字和第四个数字比较,于是6和4相比,4小,交换6和4的顺序,顺序变为:5 3 4 6 9
    • 第四次内循环:第四个数字和第五个数字比较,于是6和9相比,6小,不需要交换,顺序依然为:5 3 4 6 9。

    至此,第一层外循环结束,本轮结束后,数据顺序为:5 3 4 6 9。经过第一次排序,最大的数字已经在最后一个了,因此第二轮排序就不需要比较最后一个和倒数第二个数字了。

    第二次外循环:
    用第一个数字5作为第二轮的开始,依次比较相邻的数字。

    • 第一次内循环:第一个数字和第二个数字比较,于是5和3相比,3小,交换3和5的顺序,顺序变为:3 5 4 6 9
    • 第二次内循环:第二个数字和第三个数字比较,于是5和4相比,4小,交换4和5的顺序,顺序变为:3 4 5 6 9
    • 第三次内循环:第三个数字和第四个数字比较,于是5和6相比,5小,不需要交换顺序,顺序为:3 4 5 6 9

    本轮结束后,数据顺序为:3 4 5 6 9。经过第二次排序,倒数第二大的数字已经在倒数第二位了,排序就不需要比较倒数第二个数字和倒数第三个了。

    第三次外循环:
    用第一个数字3作为第三轮的开始,依次比较相邻的数字。

    • 第一次内循环:第一个数字和第二个数字比较,于是3和4相比,3小,不需要交换顺序,顺序为:3 4 5 6 9
    • 第二次内循环:第二个数字和第三个数字比较,于是4和5相比,4小,不需要交换顺序,顺序为:3 4 5 6 9

    第四次外循环:
    用第一个数字3作为第三轮的开始,依次比较相邻的数字。

    • 第一次内循环:第一个数字和第二个数字比较,于是3和4相比,3小,不需要交换顺序,顺序为:3 4 5 6 9
  3. 代码实现

    /**
     * 冒泡排序
     * @param arr 需要排序的数组
     */
    public static void mpSort(int arr[]){
        // 第一层循环
        for(int i = 0;i < arr.length - 1;i++){
            // 第二层循环
            for(int j = 0;j < arr.length - i - 1;j++){
                // 如果相邻的两个数字的顺序不对,就交换。
                if (arr[j] > arr[j+1]){
                    int k = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = k;
                }
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值