首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >常见排序算法-冒泡排序、选择排序 、插入排序 、快速排序、 归并排序 、堆排序

常见排序算法-冒泡排序、选择排序 、插入排序 、快速排序、 归并排序 、堆排序

作者头像
才疏学浅的木子
发布于 2022-11-20 08:50:13
发布于 2022-11-20 08:50:13
1K00
代码可运行
举报
文章被收录于专栏:CSDN文章CSDN文章
运行总次数:0
代码可运行

👨‍💻个人主页: 才疏学浅的木子 🙇‍♂️ 本人也在学习阶段如若发现问题,请告知非常感谢 🙇‍♂️ 📒 本文来自专栏: 算法 🌈 算法类型排序算法 🌈

排序算法

冒泡排序

平均时间复杂度: o(n^2) 最好时间: o(n) 最坏时间: o(n^2) 空间复杂度: o(1) 是否稳定: 稳定

简单的冒泡排序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public int[] bubbleSort(int [] nums){
        int len = nums.length;
        if(len <= 1) return nums;
        for(int i = 0;i < len;i++){
            for(int j = 0;j < len-i-1;j++){
                if(nums[j] > nums[j+1]){
                    int temp = nums[j+1];
                    nums[j+1] = nums[j];
                    nums[j] = temp;
                }
            }
        }
        return nums;
    }

冒泡排序的优化

设置标志位

设置一个标志位来标识这次遍历是否进行过交换 如果没有进行过交换则表示数组已经有序,直接退出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public int[] binarySort(int [] nums){
        int len = nums.length;
        if(len <= 1) return nums;
        
        for(int i = 0;i < len-1;i++){
            boolean isSort = true;  //是否有序
            for(int j = 0;j < len-i-1;j++){
                if(nums[j] > nums[j+1]){
                    int temp = nums[j+1];
                    nums[j+1] = nums[j];
                    nums[j] = temp;
                    isSort = false;
                }
            }
            if(isSort) break;
        }
        return nums;
    }

设置结束位置

比如初始数组为[4,3,2,1,5,6] 经过第一次排序后数组变为[3,2,1,4,5,6] 如果按照普通冒泡排序下次需要遍历的下标范围为[0,4] 但是[3,4]是已经有序的,所以可以减少比较,保存上次交换的结束位置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public int[] bubbleSort(int [] nums){
    int len = nums.length;
    if(len <= 1) return nums;
    int max_index = len-1;
    int index = max_index;
    for(int i = 0;i < len-1;i++){
        boolean isSort = true;  //是否有序
        for(int j = 0;j < index;j++){
            if(nums[j] > nums[j+1]){
                int temp = nums[j+1];
                nums[j+1] = nums[j];
                nums[j] = temp;
                isSort = false;
                max_index=j;
            }
        }
        if(isSort) break;
        index = max_index;
    }
    return nums;
    }

双向冒泡排序

与设置结束位置类似,这个是也设置了起始位置 使得在left之前的都是已经排好序的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public int[] bubbleSort(int [] nums){
        int len = nums.length;
        if(len <= 1) return nums;
        int left = 0;
        int right = len-1;

        int tleft = 0,tright = 0;
        while(left < right){
            boolean isSort = true;
            for(int i = left;i < right;i++){
                if(nums[i+1] < nums[i]){
                    int temp = nums[i];
                    nums[i] = nums[i+1];
                    nums[i+1] = temp;
                    isSort = false;
                    tright = i;
                }
            }
            if(isSort)break;
            right = tright;
            isSort = true;
            for(int i = right;i > left;i--){
                if(nums[i] < nums[i-1]){
                    int temp = nums[i];
                    nums[i] = nums[i-1];
                    nums[i-1] = temp;
                    isSort = false;
                    tleft = i;
                }
            }
            if(isSort)break;
            left = tleft;
        }
        return nums;
    }

选择排序

平均时间复杂度: o(n^2) 最好时间: o(n^2) 最坏时间: o(n^2) 空间复杂度: o(1) 是否稳定: 不稳定

选择排序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public int[] selectSort(int [] nums){
        int len = nums.length;
        if(len <= 1) return nums;
        for(int i = 0;i < len;i++){
            int minIndex = i;
            for(int j = i;j < len;j++){
                if(nums[j] < nums[minIndex]){
                    minIndex = j;
                }
            }
            int t = nums[minIndex];
            nums[minIndex] = nums[i];
            nums[i] = t;
        }
        return nums;
    }

插入排序

平均时间复杂度: o(n^2) 最好时间: o(n) 最坏时间: o(n^2) 空间复杂度: o(1) 是否稳定: 稳定

插入排序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public int[] insertSort(int [] nums){
        int len = nums.length;
        if(len <= 1) return nums;
        for(int i = 1;i < len;i++){
            int cur = nums[i];
            int preIndex = i - 1;
            while(preIndex >= 0 && nums[preIndex] > cur){
                nums[preIndex+1] = nums[preIndex];
                preIndex--;
            }
            nums[preIndex+1] = cur;
        }
        return nums;
    }

快速排序

平均时间复杂度: o(nlogn) 最好时间: o(nlogn) 最坏时间: o(n^2) 空间复杂度: o(logn) 是否稳定: 不稳定

快速排序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public void quickSort(int [] nums,int left,int right){
       if(left >= right) return;
       int l = left - 1;
       int r = right + 1;
       int t = nums[left];
       while(l < r){
           do l++;while(nums[l] < t);
           do r--;while(nums[r] > t);
           if(l < r){
               int temp = nums[l];
               nums[l] = nums[r];
               nums[r] = temp;
           }
       } 
       quickSort(nums,left,r);
       quickSort(nums,r+1,right);
    }

归并排序

平均时间复杂度: o(nlogn) 最好时间: o(nlogn) 最坏时间: o(nlogn) 空间复杂度: o(n) 是否稳定: 稳定

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public void mergeSort(int [] nums,int left,int right){
        if(left >= right) return;
        int mid = left + right >> 1;
        mergeSort(nums,left,mid);
        mergeSort(nums,mid+1,right);
        
        //需要合并 [left,mid] [mid+1,right]
        int []temp = new int[right-left+1];
        int l = left,r = mid+1,k = 0;
        while(l <= mid && r <= right){
            if(nums[l] < nums[r]) temp[k++] = nums[l++];
            else temp[k++] = nums[r++];
        }
        while(l <= mid) temp[k++] = nums[l++];
        while(r <= right) temp[k++] = nums[r++];
        for(int i = right;i >= left;i--){
            nums[i] = temp[--k];
        }
    }

堆排序

平均时间复杂度: o(nlogn) 最好时间: o(nlogn) 最坏时间: o(nlogn) 空间复杂度: o(1) 是否稳定: 不稳定

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public void heapSort(int [] nums){
        int len = nums.length;
        if(len <= 1) return;
        //构造大根堆
        for(int i = (len-1)/2; i>=0 ;i--){
            heap(nums,i,len);
        }
        //将根弄到最后
        for(int i = len-1;i >=0; i--){
            int t = nums[0];
            nums[0] = nums[i];
            nums[i] = t;
            heap(nums,0,i);
        }
    }
    //子树构建大顶堆
    public void heap(int[] nums,int index,int size){
        int max = index;
        int left = 2 * index + 1;
        int right = 2 * index + 2;
        if(left < size && nums[left] > nums[max]) max = left;
        if(right < size && nums[right] > nums[max]) max = right;
        if(max != index){
            int t = nums[index];
            nums[index] = nums[max];
            nums[max] = t;
            heap(nums,max,size);
        }
    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序[通俗易懂]
  冒泡排序是比较基础的排序算法之一,其思想是相邻的元素两两比较,较大的数下沉,较小的数冒起来,这样一趟比较下来,最大(小)值就会排列在一端。整个过程如同气泡冒起,因此被称作冒泡排序。   冒泡排序的步骤是比较固定的:
全栈程序员站长
2022/09/14
8740
十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序[通俗易懂]
六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序
这里如果max的最大值为0下标的时候,max已经被 minIndex交换,maxIndex等于minIndex获取最大元素的下标值即可。
如烟花般绚烂却又稍纵即逝
2024/12/26
2490
六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序
八大排序算法(java实现) 冒泡排序 快速排序 堆排序 归并排序 等
一、直接插入 - 1.基本思路 - 2.代码实现 - 3.时间复杂度和空间复杂度二、希尔排序 - 1.基本思路 - 2.代码实现 - 3.时间复杂度和空间复杂度三、简单选择 - 1.基本思路 - 2.代码实现 - 3.时间复杂度和空间复杂度四、堆排序 - 1.基本思路 - 2.代码实现 - 3.时间复杂度和空间复杂度五、冒泡排序 - 1.基本思路 - 2.代码实现 - 3.时间复杂度和空间复杂度六、快速排序 - 1.基本思路 - 2.代码实现 - 3.时间复杂度和空间复杂度七、归并排序 - 1.基本思路 - 2.代码实现 - 3.时间复杂度和空间复杂度八、基数排序 - 1.基本思路 - 2.代码实现 - 3.时间复杂度和空间复杂度总结
用户7886150
2020/12/04
2870
经典八种排序算法总结(带动画演示)
算法和数据结构是一个程序员的内功,所以经常在一些笔试中都会要求手写一些简单的排序算法,以此考验面试者的编程水平。下面我就简单介绍八种常见的排序算法,一起学习一下。
java技术爱好者
2020/09/22
9700
搞定大厂算法面试之leetcode精讲14.排序算法
归并排序:时间复杂度O(nlogn),分的时间复杂度O(logn),合并的过程的复杂度是O(n)
全栈潇晨
2021/12/01
3040
一文搞定十大经典排序算法
下面我们来逐一分析十大经典排序算法,主要围绕下列问题展开: 1、算法的基本思想是什么? 2、算法的代码实现? 3、算法的时间复杂度是多少?(平均、最好、最坏)什么情况下最好?什么情况下最坏? 4、算法的空间复杂度是多少? 5、算法的稳定性如何?
matinal
2020/11/27
6110
一文搞定十大经典排序算法
JavaScript 数据结构与算法之美 - 冒泡排序、插入排序、选择排序
笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习。
夜尽天明
2019/07/23
8440
JavaScript 数据结构与算法之美 - 冒泡排序、插入排序、选择排序
各种选择+冒泡+插入排序图解
由于排序题中大部分都只需要得到排序的最终结果,而不需要写排序的完整过程(例如冒泡排序,快速排序等过程)因此比赛时强烈建议使用C语言中的库函数qsort或是C++中的sort函数,接下来主讲更简洁的sort函数 1.如何使用sort排序
编程范 源代码公司
2019/07/31
5380
各种选择+冒泡+插入排序图解
用javascript分类刷leetcode-排序算法(图文视频讲解)
归并排序:时间复杂度O(nlogn),分的时间复杂度O(logn),合并的过程的复杂度是O(n)
hellocoder2028
2023/01/02
4870
【数据结构与算法】十大经典排序算法深度解析:冒泡排序、选择排序、插入排序、归并排序、快速排序、希尔排序、堆排序、计数排序、桶排序、基数排序
这个序列是逐渐减小的,gap的值较大时,数据可以更快的前后变动,但不容易"基本有序";gap较小时数据前后变动较慢,但更接近"基本有序"。 通常可以选取gap = n/3, gap = gap/3, ...,直到gap= 1。
倔强的石头_
2024/12/06
2.6K0
【数据结构与算法】十大经典排序算法深度解析:冒泡排序、选择排序、插入排序、归并排序、快速排序、希尔排序、堆排序、计数排序、桶排序、基数排序
算法之常见排序算法-冒泡排序、归并排序、快速排序
对于编程中琳琅满目的算法,本人向来是不善此道也不精于此的,而说起排序算法,也只是会冒泡排序。还记得当初刚做开发工作面试第一家公司时,面试官便让手写冒泡排序(入职之后才知道,这面试官就是一个冒泡排序"病态"爱好者,逢面试必考冒泡排序-__-)。后来看吴军的一些文章,提到提高效率的关键就是少做事情不做无用功,便对这不起眼的排序算法有了兴趣。刚好今天周末有闲,遂研究一二,与各位道友共享。
本人秃顶程序员
2019/05/26
7110
万字长文|十大基本排序,一次搞定!
大家好,我是老三,一个刷不动算法的程序员。排序算法相关题目尽管在力扣中不是很多,但是面试中动不动要手撕一下。接下来,我们看一下十大基本排序,
三分恶
2021/09/08
5630
【数据结构】关于冒泡排序,选择排序,插入排序,希尔排序,堆排序你到底了解多少???(超详解)
对于稳定性举例: 假如两个人考了一样的分数,那么先交卷的同学成绩因该排在后交卷的同学的前面,这样才符合常理逻辑。
用户11288949
2024/09/24
1520
【数据结构】关于冒泡排序,选择排序,插入排序,希尔排序,堆排序你到底了解多少???(超详解)
《数据结构与算法之美》——冒泡排序、插入排序、选择排序
当然,撇开这些业务场景,排序算法本身有一些自己的衡量指标,比如我们经常提到的复杂度分析。
JackieZheng
2019/05/25
4660
【leetcode】手撕排序算法,力扣912题的7大排序算法代码归总(纯代码)
用户11288949
2025/04/08
1050
【leetcode】手撕排序算法,力扣912题的7大排序算法代码归总(纯代码)
面试中可能被问到的常用排序算法
排序算法是一种比较简单的算法,从我们一开始接触计算机编程开始接触的可能就是排序或者搜索一类的算法,但是因为排序在其他的一些算法中应用较多,所以为了提高性能已经研究了多种排序算法。目前区别排序算法主要还是以时间复杂度,空间复杂度,稳定性等来排序,接下来我们分别分析。
本人秃顶程序员
2019/05/12
7380
面试中可能被问到的常用排序算法
TypeScript算法题实战——详解十大经典排序算法(插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序)
算法是程序开发中不可或缺的一部分。排序算法作为最基本、最常用的算法之一,在程序开发中起到了至关重要的作用。本文将深入探讨十大经典排序算法,探索这些排序算法的实现原理、时间复杂度及其适用场景并使用TypeScript语言来实现。废话不多说,让我们一同踏上 TypeScript排序算法实战的旅程!
中杯可乐多加冰
2025/01/03
1040
各种排序算法
冒泡排序还有一种优化算法,就是立一个flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序
Krry
2018/10/19
6310
各种排序算法
【数据结构初阶】排序算法(下)冒泡排序与归并排序
交换排序基本思想: 所谓交换**,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置**。 交换排序的特点是: 将值较大的数据向序列的尾部移动,值较小的数据向序列的前部移动(也可以反过来)。
fhvyxyci
2024/10/03
1630
【数据结构初阶】排序算法(下)冒泡排序与归并排序
手撕十大排序算法
为了方便在程序种测试算法的步骤和正确性,为此写了一个通用的代码如下,方便于在main方法里进行调试
ma布
2024/10/21
1480
手撕十大排序算法
推荐阅读
十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序[通俗易懂]
8740
六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序
2490
八大排序算法(java实现) 冒泡排序 快速排序 堆排序 归并排序 等
2870
经典八种排序算法总结(带动画演示)
9700
搞定大厂算法面试之leetcode精讲14.排序算法
3040
一文搞定十大经典排序算法
6110
JavaScript 数据结构与算法之美 - 冒泡排序、插入排序、选择排序
8440
各种选择+冒泡+插入排序图解
5380
用javascript分类刷leetcode-排序算法(图文视频讲解)
4870
【数据结构与算法】十大经典排序算法深度解析:冒泡排序、选择排序、插入排序、归并排序、快速排序、希尔排序、堆排序、计数排序、桶排序、基数排序
2.6K0
算法之常见排序算法-冒泡排序、归并排序、快速排序
7110
万字长文|十大基本排序,一次搞定!
5630
【数据结构】关于冒泡排序,选择排序,插入排序,希尔排序,堆排序你到底了解多少???(超详解)
1520
《数据结构与算法之美》——冒泡排序、插入排序、选择排序
4660
【leetcode】手撕排序算法,力扣912题的7大排序算法代码归总(纯代码)
1050
面试中可能被问到的常用排序算法
7380
TypeScript算法题实战——详解十大经典排序算法(插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序)
1040
各种排序算法
6310
【数据结构初阶】排序算法(下)冒泡排序与归并排序
1630
手撕十大排序算法
1480
相关推荐
十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序[通俗易懂]
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档