经典七大排序算法

七大经典排序算法编码实现全集——Java实现 package Sort; import java.util.Arrays; public class Sort { public static void main(String[] args) { // 定义一个数组,并进行静态初始化 int[] arr = {61, 17, 29, 22, 34, 21, 50, 1, 62}; //遍历数组,获取数组元素值 printArray(arr); System.out.println("------------------------"); //调用冒泡排序 阅读详情

首先排序分为四种:

  交换排序: 包括冒泡排序,快速排序。

  选择排序: 包括直接选择排序,堆排序。

  插入排序: 包括直接插入排序,希尔排序。

  归并排序: 归并排序。

(一) 冒泡排序

冒泡排序的基本思想是,对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序。时间复杂度为==O(n^2)==。

 /**
     * 冒泡排序
     *
     * @param arr
     */
    public static void bubbleSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            boolean flag = true;//设定一个标记,若为true,则表示此次循环没有进行交换,也就是待排序列已经有序,排序已然完成。
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    swap(arr,j,j+1);
                    flag = false;
                }
            }
            if (flag) {
                break;
            }
        }
    }

(二)插入排序

想想扑克牌就很好理解了。时间复杂度为==O(n^2)==

Java代码实现

public static void insertSort(int[] A){

        for(int right = 1;right < A.length;right++){
            int temp = A[right];
            int left = right-1;
            while(left >= 0 && A[left]>temp){
                A[left+1] = A[left]; 
                left--;
            }
            A[left+1] = temp;
        }
    }

复杂度分析

①插入排序的时间复杂度 就是判断比较次数有多少,而比较次数与 待排数组的初始顺序有关,当待排数组有序时,没有移动操作(第8行for不成立),此时复杂度为O(N),当待排数组是逆序时,比较次数达到最大–对于下标 i 处的元素,需要比较 i-1 次。总的比较次数:1+2+…+N-1 ,故时间复杂度为==O(n^2)==
①可以看出,算法中只用到了一个临时变量(第6行),故空间复杂度为O(1)

(三)归并排序

思想
分解:分解待排序的n个元素的序列成n/2个元素的两个子序列
解决:使用归并排序递归地排序两个子序列
合并:合并两个已经排序好地子序列为一个序列 产生答案

     public static int[] mergeSort(int[] A ,int left,int right){
            if(left < right){
                int mid = left + (right - left)/2;

                //分
                mergeSort(A,left,mid);
                mergeSort(A,mid+1,right);

                //合并
                mergeGetArray(A,left,mid,right);
            }
            return A;
        }

     public static void mergeGetArray(int[] A,int left,int mid,int right){
            int[] TempRes = new int[right-left+1];
            int i = left,j = mid +1;
            int k = 0;

            while(i <= mid && j <= right){
                if(A[i]<A[j]){
                    TempRes[k++] = A[i++];

                }else{
                    TempRes[k++] = A[j++];
                }
            }    

            while(i <= mid){
                TempRes[k++] = A[i++];
            }

            while(j <= right){
                TempRes[k++] = A[j++];
            }

            for(i = 0;i < TempRes.length;i++){
                A[left+i] = TempRes[i];
            }
     }

(四)堆排序

 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为==O(nlogn)==,它也是不稳定排序。

思想:
将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了

代码实现
维护堆的性质的函数

//维护堆的性质的函数,根据大小来调整某个结点以及它的孩子结点的位置
MAX_HEAPIFY(A,i){
 left = 2i+1;  //左孩子
 right = 2i+2 ; //右孩子

 //以下为判断结点以及它的孩子结点哪个最大,孩子结点比父节点大则调整二者位置
 if( A[left] <= A.heap-size and A[Left]>A[i])
      largest = Left;
else largest = i;

 if( A[right] <= A.heap-size and A[right]>A[largest])
      largest = r;

if( largets != i)
{
    exchage A[i] with A[largest]
    MAX_HEAPIFY(A,largest)
}
}

构建堆的函数

//构建堆的函数
BUID-HEAP(A){
    A.heap-size = A.length;
    for(int i = A.length/2-1;i>=0;i++){
            MAX-HEAPIFY(A,i);//从最后一个非叶子结点开始调整,直到根节点的index为0
    }
}

有了前面的铺垫,我们可以很容易写出堆排序

堆排序:
HEAP-SORT(A){
    BUID-HEAP(A)  //构建堆
    for(int i = A.length-1;A>=0;A--){
        exchange A[0] with A[i]  //每次将堆的顶端也就是最大值放在数组最后边
        A.heap-size = A.heap-size -1
        MAX-HEAPIFY(A,1)   //维护堆
    }
}
 ```
### (五)快速排序
在平均状况下,排序 n 个项目要==Ο(n log n)== 次比较。在最坏状况下则需要Ο(n^2)次比较,但这种状况并不常见。
快速排序使用分治法(Divide and conquer)策略(归并排序也是分治法)来把一个串行(list)分为两个子串行(sub-lists)。是冒泡排序的改进型.

**算法步骤:**
1.  首先在数组中选择一个基准点(该基准点的选取可能影响快速排序的效率,后面讲解选取的方法)

2.  重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

``` java
    public static void QuickSort(int[] arr,int low,int high){

        while(low < high){
            int mid = Division(arr,low,high);
            QuickSort(arr,low,mid-1);
            QuickSort(arr,mid+1,high);
        }

    }



    private static int Division(int[] arr,int low,int high) {

        //选择一个基准数,一次循环将其放到属于它的位置
        int temp = arr[low];

        while(low <  high){
            while(low < high && arr[high] >= temp){
                high--;
            }
            arr[low] = arr[high];
            while(low <  high && arr[low] <= temp){
                low++;
            }
            arr[high] = arr[low];
        }
        arr[low] = temp;

        return low;
    }




<div class="se-preview-section-delimiter"></div>

注意:快速排序在序列中元素很少时,效率将比较低,不然插入排序,因此一般在序列中元素很少时使用插入排序,这样可以提高整体效率。

(六)直接选择排序

直接选择排序最类似于人的本能思想,比如把大小不一的玩具让三岁小毛孩对大小排个序,那小孩首先会在这么多玩具中找到最小的放在第一位,然后找到次小的放在第二位,以此类推。。。。。。

public static void SelectSort(int[] arr){

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

            int Index = i;

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

                if(arr[Index]>arr[j])
                    Index = j;
            }
            //swap arr[i] with arr[Index]
            int temp = arr[i];
            arr[i] = arr[Index];
            arr[Index] = temp;
        }
    }




<div class="se-preview-section-delimiter"></div>

(七)希尔排序

希尔是插入排序的改进版。 如果当数据是”5, 4, 3, 2, 1“的时候,此时我们将“无序块”中的记录插入到“有序块”时,估计俺们要崩盘,
shell根据这个弱点进行了算法改进,融入了一种叫做“==缩小增量排序法==”的思想。

首先要明确一下增量的取法:

  第一次增量的取法为: d=count/2;

  第二次增量的取法为:  d=(count/2)/2;

  最后一直到: d=1;
public static void shellSort(int[] arr){
        int j = 0;
        int temp = 0;

        for(int incre = arr.length/2 ; incre>0 ;incre /= 2){

            for(int i = incre; i < arr.length;i++){
                temp = arr[i];          
                for(j = i-incre; j >= 0 ; j -= incre){

                    if(temp < arr[j]){
                        arr[j + incre] = arr[j];
                    }else{
                        break;
                    }
                }
                arr[j + incre] = temp;
            }
        }
    }
泛微OA与金蝶云星空深度集成实战:审批与表单双场景解析 本文深入解析泛微OA与金蝶云星空的深度集成实战,聚焦审批流程与表单对接两大核心场景。通过具体案例,详细阐述了如何实现业务数据与审批流程的自动联动,打破数据孤岛,提升企业运营效率与数据一致性,并分享了接口设计、安全策略及实战避坑指南。 阅读详情

相关推荐

virtuoso--DFF

27-实验课-std_cell2

qq_61440044的博客 2007

基于比较的算法之二:选择排序

算法思想: 排序数组内元素由小到大: 1.每一趟从序列中选出最大的元素,然后与末尾的元素对调(决定了此排序是不稳定的,因为有可能把原位置元素调换到与和它等值的元素前面)。 2.重复1的动作,把上一部调换到末尾的元素排除在外。 3.当只剩下第一个元素时,排序完毕。 时间复杂度: 设共有n个元素 最好情况,原来数组元素正好是排好序的,则第i次扫描的比较次数是Ci=n-i,i=0...

dianxiaohuo4358的博客 176

专治疑难系列 - 解决打印机凭证冲突问题

一、问题描述 二、解决方法 三、问题已解决

Passerby_Wang的博客 2万+

九大排序算法之选择排序(原理及实现)

1、算法思想:选择排序,从头至尾扫描序列,找出最小的一个元素,和第一个元素交换,接着从剩下的元素中继续这种选择和交换方式,最终得到一个有序序列。 2、算法过程 举个栗子(第一趟的排序过程) 原始序列:49、38、65、97、76、13、27、49 1)在进行选择排序过程中分成有序和无序两个部分,开始都是无序序列 结果:49、38、65、97、76、13、27、49 2)从无序序列中取出...

changhangshi的博客 11万+

【GIS效率手册】告别C盘爆满:三步重置ArcMap默认地理数据库路径

本文针对ArcMap用户C盘空间常被占满的问题,提供了三步重置默认地理数据库路径的详细教程。通过修改地图文档属性,将数据存储位置从C盘迁移至其他驱动器,不仅能有效释放系统盘空间,还能提升数据管理效率与安全性,是GIS数据规范化管理的关键一步。

g2h3i4j5的博客 546

STM32F407通过SMBus协议精准读取BQ40Z50电池电量

本文详细介绍了STM32F407通过SMBus协议精准读取BQ40Z50电池电量的实现方法。从硬件连接到软件驱动开发,再到通信异常排查,提供了完整的解决方案。重点解析了SMBus协议的特殊时序要求、GPIO模拟驱动的关键代码,以及实际调试中的常见问题与对策,帮助开发者高效完成电池管理系统开发。

weixin_29189003的博客 253

白话经典算法系列之八 MoreWindows白话经典算法之七大排序总结篇

在我的博客对冒泡排序,直接插入排序,直接选择排序,希尔排序,归并排序,快速排序和堆排序这七种常用的排序方法进行了详细的讲解,并做成了电子书以供大家下载。下载地址为:http://download.youkuaiyun.com/detail/morewindows/4443208。       有网友提议到这本《MoreWindows白话经典算法之七大排序》电子书讲解细致用来平时学习是非常好的,但是页数有22页

MoreWindows Blog 5万+

LDRA Testbed软件静态分析_操作指南

从本文起,将开始LDRA Testbed(TBrun)教程的系列文章,包括软件静态分析、单元测试、集成测试,以及基于Testbed的自动化工具开发、持续集成、常见问题解答等。LDRA公司是专业的软件测试工具与测试技术、咨询服务提供者,其总部位于英国利物浦。其旗舰产品Testbed/TBrun功能全面、易于使用,不仅适合于主机平台软件测试,同时适合于嵌入式软件测试。不仅能进行软件静态测试,还能进行软件单元测试、软件集成测试,在白盒测试领域运用比较广泛。

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 1万+

基于用户投票的排名算法(四):牛顿冷却定律

作者:阮一峰 日期:2012年3月16日 这个系列的前三篇,介绍了Hacker News,Reddit和Stack Overflow的排名算法。 今天,讨论一个更一般的数学模型。 这个系列的每篇文章,都是可以分开读的。但是,为了保证所有人都在同一页上,我再说一下,到目前为止,我们用不同方法,企图解决的都是同一个问题:根据用户的投票,决定最近一段时间内的"...

weixin_30640291的博客 512

Sigrity System Explorer Transient Analysis模式进行瞬态仿真分析操作指导-差分信号

Sigrity System Explorer Transient Analysis模式可以用于瞬态仿真分析,通过搭建简易拓扑用于前仿真分析通道的时域性能,下面搭建一个简易的差分拓扑进行说明,以下图为例,准备好发送接收端的IBIS模型, (ibis_se.ibs,本例发送接收端都使用相同的IBIS模型),以及传输线的S参数模型(welement_se.sp)最上方的图形界面是传输线的模型,本例是一个上下都有参考平面的带状线,右侧的梯形是蚀刻角度,根据W1和W2以及铜厚来确定。

weixin_54787054的博客 440

SAP 中租赁资产的实现需区分经营租赁与融资租赁,核心围绕资产主数据配置、折旧与利息设置、科目分配及业务操作展开

摘要:SAP系统租赁资产管理需区分经营租赁与融资租赁,通过SPRO配置资产主数据、折旧范围、利息计算及科目分配。关键步骤包括:激活折旧范围利息计算(OABZ)、设置租赁资产类别(OAYZ)、维护总账科目(AO90)及创建租赁资产主数据(AS01)。业务操作涵盖资产资本化(ABZON)、折旧利息过账(AFAB)、租金支付(F-53)及终止处理(ABUMN)。核心配置要点在于准确设置租赁类型、利率参数和科目联动,确保系统自动计算折旧与利息并生成正确凭证。

金牌架构师 1076

七大经典排序算法总结【详解】

数据量规模较小,考虑插入或选择。当元素分布有序时插入将大大减少比较和移动记录的次数,如果不要求稳定性,可以使用选择,效率略高于插入;数据量规模中等,使用希尔排序;数据量规模较大,考虑堆排序(元素分布接近正序或逆序)、快速排序(元素分布随机)和归并排序(稳定性);一般来说不使用冒泡。

weixin_63189874的博客 8696

海思3516DV300智能算法实现

海思3516DV300智能算法实现

xiaoning132的专栏 937

七大经典排序算法

七大经典排序算法

lolly1023的博客 1672

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

七大七大经典排序算法总结

七大七大经典排序算法总结(C语言描述)一.交换排序1.冒泡排序2.快速排序二.插入排序1.直接插入排序2.希尔(shell)排序三.选择排序1.直接选择排序2.堆(Heap)排序四.归并排序 总结如下: 一.交换排序 交换排序的基本思想都为通过比较两个数的大小,当满足某些条件时对它进行交换从而达到排序的目的。 1.冒泡排序 基本思想:比较相邻的两个数,如果前者比后者大,则进行交换。每一轮排序结束...

qq_42849269的博客 685

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

七大经典排序算法总结

概念 排序 排序:排序是计算机的一种操作方法,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。(就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作)。 通常我们提到的排序指的是排升序,就是按从小到大的顺序排列。 通常意义上的排序都是指的原地排序(in place sort)。 稳定性 两个相等的数据,如果经过排序后,排序算法能保证其相对位置不发生变化,则我们称该算法是具备稳 定性的排序算法。 排序算法简介 Java语言中基于比较的“原地”排序算法有7种。(基于比较能力是

weixin_45803426的博客 312

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

经典七大比较排序算法 ·上

选择排序/冒泡排序/堆排序/快速排序/归并排序

阿顺的学习记录。 3514

了解七大经典排序算法,看这一篇就足够了!!!

排序算法

m0_73920844的博客 385

数据结构——七大经典排序算法

目录 排序的概念 插入排序 直接插入排序 希尔排序(缩小增量的排序) 选择排序 直接选择排序 堆排序 交换排序 冒泡排序 快速排序 归并排序 对于排序算法的总结 所有的排序算法均已上传至码云(Gitee)中,可以点击查看:七大经典排序算法代码 排序的概念 排序即使一串记录,按照其中某个或某些关键字的大小,递增或者递减的排列起来。排序分为内部排序和外部排序,内部排序即将数据元素全部放在内存中的排序,外部排序即当数据元素过多不能同时放在内存中排序时,根据排序的要求...

qq_58284486的博客 6974

java七大类_Java实现经典七大经典排序算法

利用Java语言实现七大经典排序算法:冒泡排序、选择排序、插入排序、希尔排序、堆排序、归并排序以及快速排序。分类类别算法插入排序类插入排序、希尔排序选择排序类选择排序、堆排序交换排序类冒泡排序、快速排序归并排序类归并排序复杂度算法平均情况最好情况最坏情况辅助空间稳定性复杂性冒泡排序O(n^2)O(n)O(n^2)O(1)稳定简单选择排序O(n^2)O(n^2)O(n^2O(1)稳定简单插入排序O(...

weixin_35712223的博客 177

七大排序经典排序算法

七大经典排序常用算法!!!

weixin_73233099的博客 8286

程序员必备:从基础到进阶的七大经典排序算法解析

从乌龟般的冒泡到闪电侠般的快速排序,每个算法都有其独特魅力。记住:没有最强的算法,只有最合适的算法!下次遇到排序问题,不妨先问自己一句:“今天我要当乌龟,还是闪电侠?(本文代码均支持Python3运行,可直接复制到IDE玩耍~)

JakeMa1024的博客 900

七大经典比较排序算法

七大经典比较排序算法(插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序hoare版本、快速排序挖坑法、快速排序前后指针法、快速排序三数、小区间优化、快速排序非递归、归并排序、归并排序非递归实现)。

如果这是最后一页 能否让我把故事重写 5263
上一篇: 面试常问的知识点总结(持续更新)
下一篇: 常见开发框架
HY_Chan
博客等级 码龄10年 54粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值