IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 排序算法-交换排序-冒泡排序 -> 正文阅读

[数据结构与算法]排序算法-交换排序-冒泡排序

排序算法-交换排序-冒泡排序

基于“交换”的排序:根据序列中两个元素的关键字的比较结果来对换这两个记录在序列中的位置。

算法思想:

从后往前(或者从前往后)两两比较相邻元素的值,若为逆序,则交换他们,如果两个元素相同的话,并不交换他们的位置,这样可以保证算法的稳定性,直到序列比较完毕。这样的过程为“一趟”冒泡排序。

首先第一个关键字和第二个关键字进行比较,如果第一个大,则两者交换,否则不交换;然后第二个关键字与第三个关键字进行比较,如果第二个大,则两者交换,否则不交换…。一直按照这种方式进行下去,最终最大的那个关键字被交换到了最后,一趟冒泡完成。经过n-1趟冒泡,最终整个使得整个序列有序。整个过程中,大的关键字像“沉底”,小的关键字像“气泡“”一样向上“浮动”。

每一趟排序之后都会使一个元素移动到最终位置,已经确定最终位置的元素在之后的处理中无须再对比。

代码:

public static void main(String[] args) {
        int[] nums = {3,8,4,5,6,8,9,0,1};
        bubblesort2(nums,nums.length);
        for(int num:nums){
            System.out.print(num);
        }
    }
    public static void bubblesort(int[] nums, int n){
        for(int i=n-1;i>0;--i){        //总共n个数,需要n-1趟冒泡
            for(int j=0;j<i;++j){         // 每次对未排好序的关键字进行冒泡,此处代码为将较大关键字下沉到数组末尾,
                if(nums[j]>nums[j+1]){    // 每经过一次冒泡排序都会有一个关键字放到最终的位置
                    int temp = nums[j];
                    nums[j] = nums[j+1];
                    nums[j+1] = temp;
                }
            }
        }
    }

如果某一趟排序过程中未发生交换,说明序列已经有序,则算法可以提前结束。

代码

public static void bubblesort2(int[] nums, int n){
        for(int i=n-1;i>0;--i){           //总共n个数,需要n-1趟冒泡
            boolean flag = false;         // 判断本次冒泡是否有序的变量,如果数组已经有序,则提前退出。
            for(int j=0;j<i;++j){         // 每次对未排好序的关键字进行冒泡,此处代码为将较大关键字下沉到数组末尾,
                if(nums[j]>nums[j+1]){    // 每经过一次冒泡排序都会有一个关键字放到最终的位置
                    int temp = nums[j];
                    nums[j] = nums[j+1];
                    nums[j+1] = temp;
                    flag = true;
                }
            }
            if(!flag) break;             // 判断本次冒泡是否有序,如果数组已经有序,则提前退出。
        }
    }

时间复杂度:(Bubble sort 2)

  1. 最好情况:待排序序列有序,此时内层循环中if语句的条件始终不成立,交换不发生,且内层循环执行 n ? 1 n-1 n?1次后整个算法结束,时间复杂度为 O ( n ) O(n) O(n).
  2. 最坏情况:待排序序列逆序,此时对于外层循环的每次执行,内层循环中的if语句始终成立,内层循环中的关键字交换与对比需要执行 n ? i n-i n?i次。i的取值为 1 至 n ? 1 1 至 n-1 1n?1。因此总共的交换(对比)次数为 ( n ? 1 + 1 ) ( n ? 1 ) / 2 = n ( n ? 1 ) / 2 (n-1+1)(n-1)/2 = n(n-1)/2 (n?1+1)(n?1)/2=n(n?1)/2, 时间复杂度为 O ( n 2 ) . O(n^{2}). O(n2).

平均时间复杂度为 O ( n 2 ) O(n^{2}) O(n2)

空间复杂度:O(1).

算法稳定性:稳定

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-26 22:27:24  更:2021-12-26 22:29:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 17:22:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码