基础算法:排序算法

算法之排序算法:从基础到实战 大家好!我写这篇文章的初衷是想和大家一起学习进步。在计算机科学领域,算法是核心,排序算法更是基础中的基础,掌握它对提升编程能力至关重要。今天,咱们就来深入学习排序算法,希望能和大家共同成长,一起探索算法世界的奥秘。 阅读详情

典型的排序算法有:选择排序(selection sort)、插入排序(insertion sort)、希尔排序(shellsort)、合并排序(mergesort)、快速排序(quicksort)、堆排序(heapsort)。

选择哪种排序算法,要考虑三个条件: 是否依赖输入值(input values)、是否需要额外空间(extra memory)、对于相等键如何处理。

基础概念:

An inversion is a pair of entries that are out of order in the array.

1. 逆序(inversion): 在数组中,一个逆序(inversion)是不正常顺序的项目对。

例如:{3, 1, 5 , 2} 的逆序对有:(3,1)、(3,2)、(5,2)

2. 部分排序(partially sorted): 在一个数组中,逆序的个数小于数组大小的固定倍数(逆序个数<= cN, c为固定倍数,N为数组大小),那么对该数组的排序称为 部分排序。

说明: 进行排序的数组,每个元素应该实现了 Comparable ,各种排序通用的方法有:

    /**
     * 比较大小
     * @param v
     * @param w
     * @return
     */
    public static boolean less(Comparable v, Comparable w){
        return v.compareTo(w) < 0;
    }

    /**
     * 交换元素
     * @param a
     * @param i
     * @param j
     */
    public static void exch(Comparable[] a, int i, int j){
        Comparable t = a[i];
        a[i] = a[j];
        a[j] = t;
    }

一、选择排序(Selection sort)

排序后会打乱原有的正确排序,是在原地进行排序,排序运行时间的增长率为N^{2},是需要使用一个额外的空间。

    /**
     * 选择排序,将 最小值移到最前面
     * @param a
     */
    @Override
    public void sort(Comparable[] a) {
        // Sort a[] into increasing order.
        int N = a.length;
        for (int i=0; i<N; i++){
            int min = i;
            for (int j=i+1; j<N; j++){
                if(less(a[j], a[min])){
                    min = j;
                }
                exch(a, i, min);
            }
        }
    }

二、插入排序(insertion sort)

适用: 插入排序对“部分排序”和小数组排序是非常好的方法。

对于特定类型的非随机数组,使用插入排序,工作效率比较高。

插入排序大概比选择排序的效率快两倍。

排序之后不会打乱原来正常的排序(stable),是原地排序,排序运行时间的增长率为N到N^{2}之间, 取决于要排序的项。

    /**
     * 插入排序
     * @param a
     */
    @Override
    public void sort(Comparable[] a) {
        // Sort a[] into inCreasing order
        int N = a.length;
        for (int i = 0; i < N; i++) {
            // Insert a[i] among a[i-1], a[i-2], a[i-3].....
            for (int j = i; j >0 && less(a[j], a[j-1]); j--) {
                exch(a, j, j-1);
            }
        }
    }

缺点: 插入排序对大的无序数组是效率低的。因为插入排序一次只能改变相邻两个元素的位置,如果一个最小的元素位于数组的末尾,就需要N-1次排序。

三、希尔排序(Shellsort)

希尔排序是对插入排序(Insertion sort)的拓展。增长序列可以计算出来,也可以将增长序列存在数据中。下面的算法增长序列是计算出来的 :((3^k) -1 )/2  ==> while (h < N /3)  h= 3 * h + 1;

性能: 希尔排序不一定是二次的。

例如,对于下面的具体实现,在最坏的情况下,排序中的比较次数是和 N^(3/2)  成比例。

希尔排序不是稳定的(改变相同值的位置),是原地排序算法,运行时间的增长率为NlogN , 需要1个额外空间。

    @Override
    public void sort(Comparable[] a) {
        // Sort a[] into increasing order.
        int N = a.length;
        int h = 1;
        // (3^k -1)/2
        while (h < N / 3) h = 3 * h + 1;
        while (h >= 1) {
            // h-sort the array
            for (int i = h; i < N; i++) {
                // Insert a[i] among a[i-h], a[i-2*h]...
                for (int j = i; j >= h && less(a[j], a[j - h]); j -= h) {
                    exch(a, j, j - h);
                }
            }
            h = h / 3;
        }
    }

经验丰富的程序员通常选择希尔排序(shellsort),因为即便对于中等大小的数组,这个排序算法的运行时间也是可以接受的。

shellsort只需要很少数量的代码,并且使用shellsort不需要额外的空间。

使用场景: 如果在一个系统排序不可用的情况下(例如,代码用于硬件或者嵌入式系统),解决一个排序问题,可以安全的选择希尔排序(shellsort)。一段时间之后,再确定是否值得换成更复杂的、高级的方法。

 

四、归并排序(mergesort)

归并排序:为了排序一个数组,将这个数组分成两半,排序这两半(递归操作),然后合并最终的结果。

递归排序最诱人的是,该算法保证对于任何有N个项的数组,所花时间与NlogN成比例。而递归排序重要的缺点是,使用了额外的空间,额外空间的大小与数组大小N成比例。

归并排序有两种实现方法,Top-down和down-up。  归并排序是稳定的(如果两个元素相同,不改变原来的位置),不是原地排序,排序运行时间的增长率为NlogN, 额外的空间为lgN。

4.1 在原地合并的抽象: Abstract in-place merge

前提假设: 一个数据Comparable[] a 被分成两部分第一部分坐标为 lo 到 mid ,第二部分的坐标为 mid+1 到hi;这两部分都已经排完序了。

    /**
     *  原地合并的抽象   Abstract in-place merge
     *  通过复制数组中的每一项到一个副本中,然后再合并到原来的数组中
     * @param a
     * @param lo
     * @param mid
     * @param hi
     */
    public static void merge(Comparable[] a, int lo, int mid, int hi){
        // Merge a[lo..mid] with a[mid+1..hi].
        int i=lo, j= mid+1;
        // Copy a[lo..hi] to aux[lo..hi].
        Comparable[] aux = new Comparable[a.length];
        for (int k=lo; k<=hi;k++){
            aux[k] = a[k];
        }
        
        // Merge back to a[lo..hi].
        for (int k=lo; k<=hi; k++){
            if (i>mid) a[k] = aux[j++];
            else if (j>hi) a[k] = aux[i++];
            else if (less(aux[j], aux[i])) a[k] = aux[j++];
            else a[k] = aux[i++];
        }
    }

4.2 自上而下的归并排序 (Top-down mergesort)

Top-down mergesort 是一个基于Abstract in-place merge 的递归归并算法。

/**
     * Top-down mergesort
     * recursive
     * @param a
     * @param lo
     * @param hi
     */
    private static void sort(Comparable[] a, int lo, int hi){
        if (hi<=lo) return;
        int mid = lo + (hi-lo)/2;
        // Sort left half
        sort(a, lo, mid);
        // Sort right half
        sort(a, mid + 1, hi);
        // Merge results 
        merge(a, lo, mid, hi);
    }

Top-down mergesort 和 abstract in-place mergesort 不在同一个层次,因为我们能排序一个大的数组,而不需要检查每一个条目。我们能够对百万量级(或更多)的元素项使用Top-down mergesort方法来排序,但却不能使用插入排序(insertion sort)或选择排序(selection sort)。

mergesort 的主要缺点是需要 为辅助合并的数组 分配与数组大小N成比例的额外空间。如果空间稀缺,我们需要考虑其他方法。

另外,通过认真考虑后对实现进行修改,还可以大幅缩短mergesort的运行时间。

(1) 对于子数组使用插入排序:对小的数组使用插入排序,将优化典型归并排序运行时间10%或15%;

(2)测试数据是否已经排序:通过增加一个测试,如果a[mid]小于或等于a[mid+1],就跳过调用merge()方法。这样做,仍然需要递归调用,但是对于任何排序的子数组是线性的。

(3)消除向辅助数组中的拷贝:这样是消除向辅助数组拷贝的时间,但不能消除因为辅助数组而使用的空间。为了这样做,需要进行两次排序方法的调用:第一次从给定数组拿到输入经排序后放到辅助数组中,第二次从辅助数组获取输入经过排序后放到给定数组。

4.3 Bottom-up mergesort

@Override
    public void sort(Comparable[] a) {
        int N = a.length;
        for (int sz = 1; sz < N; sz = sz + sz) {
            for (int lo = 0; lo < N - sz; lo += sz + sz) {
                merge(a, lo, lo + sz - 1, Math.min(lo + sz + sz - 1, N - 1));
            }
        }
    }

当数组的长度为2的乘方的时候,top-down 和 bottom-up mersort  有相同的比较和数组读取次数,仅仅顺序不同。当数组的长度不是2的乘方的时候,这两种算法对于比较和数组的读取次数是不同的。

Bottom-up mergesort 算法为了排序一个长度为N的数组,需要使用 1/2NlgN 到 NlgN 次比较 和 最多 6NlgN 次数组的读取。

归并排序是基于比较的算法中渐进最优的算法。

五、快速排序(Quick sort)

快速排序比任何其他的排序算法使用都广泛。quicksort 有两个特点:原地排序(仅使用很小的辅助‘堆stack’容器),平均排序一个数组所需时间和NlogN 成正比。

算法的基础

快速排序是一个分治(divide-and-conquer)的排序方法。通过将数组分成两部分,然后分别排序子数组。

快速排序是对归并排序(mergesort)的补充:对于归并排序mergesort,我们将数组分成两个子数组,将这两个子数组排序,然后结合这两个已经排序的子数组,让真个数组排序;对于快速排序quicksort,当两个子数组是已经排序了,那么整个数组都是已经排序了。第一种情况是,在作用于整个数组之前进行递归;第二种情况是,在作用于整个数组之后进行递归。

对于归并排序(mergesort),数组是按照一半进行分割的;对于快速排序(quicksort),被分割的位置取决于数组的内容。

快速排序算法的核心是分离的过程。被分割的数组由三部分组成: 左边的子数组、分割项、右边的子数组。应该保证:

(1)分割项 a[j] 所处的位置就是在排序后数组的最终位置;

(2)对于分割项左边的数组,没有一个比分割项的大;

(3)对于分割项右边的数组,没有一个比分割项的小;

/**
 * @Date 2019-07-12
 * @Author lifei
 */
public class Quick extends SortCommont {


    @Override
    public void sort(Comparable[] a) {
        /**
         * 随机打乱 数据a元素的顺序
         * 让这个算法变成随机算法,为了更好预测算法的性能
         * 排除对输入的依赖(Eliminate dependence on input))
         */
        StdRandom.shuffle(a);
        sort(a, 0, a.length-1);

    }

    /**
     * quicksort 的递归排序
     * @param a 数组
     * @param lo 较小的索引值
     * @param hi 较大的索引值
     */
    public static void sort(Comparable[] a, int lo, int hi){
        if (hi <= lo) return;
        // 分割
        int j = partition(a, lo, hi);
        // 对左边子数组进行排序: a[lo...j-1]
        sort(a, lo, j-1);
        // 对右边子数组进行排序: a[j+1.. hi]
        sort(a, j+1, hi);

    }

    /**
     * quicksort 的关键方法
     * @param a
     * @param lo
     * @param hi
     * @return
     */
    public static int partition(Comparable[] a, int lo, int hi){
        int i = lo, j=hi+1;
        Comparable v = a[lo];
        while (true){
            // Scan right, Scan left, check for scan complete, and exchange
            while (less(v, a[++i])) if (i==hi) break;
            while (less(a[--j], v)) if (j==lo) break;
            if (i>=j) break;
            exch(a, i, j);
        }
        // Put v = a[j] into position
        exch(a, lo, j);
        return j;
    }
}

快速排序算法的潜在麻烦: 如果分区不平衡,该算法将极其低效。例如,第一次分区的项是最小的项,第二次分区的时用第二小的项,依次类推,最终导致出现大量分区的大的子数组。为了避免这种情况,在使用快速排序之前进行随机排序的原因。

快速排序的优化

(1)切断,使用插入排序。基于两点观察:对极其小的子数组进行排序的时候,快速排序比插入排序要慢;快速排序对于小的子数组也会递归调用;为此,使用下面的语句代替原来 if (hi <= lo) return;

if(hi <= lo + M) { Insertion.sort(a, lo, hi); return;}

M的取值要依赖于系统,但在大多情况下,M取 5 到15 之间的值 ,工作的效果都很好。

(2) Quicksort with 3-way partitioning对有大量重复元素的数组进行排序

思路:将数组分为三段 before、during、after。

before段的的所有元素值小于during段的值,during段的所有元素值都都相等,after段的所有元素值都大于after。

    /**
     * 使用三段式对数据进行排序: 第一段存放的是小于分割值,第二段存放的是等于分割值, 第三段存放的是大于分割值
     * @param a
     * @param lo
     * @param hi
     */
    private static void sort(Comparable[]a, int lo, int hi){
        if (hi<=lo) return;
        int lt = lo, i = lo+1, gt = hi;
        Comparable v = a[lo];
        while (i<=gt){
            int com = a[i].compareTo(v);
            if (com<0) exch(a, lt++, i++);
            else if (com>0) exch(a, i, gt--);
            else i++;
        }
        sort(a, lo, lt-1);
        sort(a, gt+1, hi);
    }

 

六、堆排序

写到另一篇博客了:(二叉树)堆排序:HeapSort

探秘Python排序算法:从基础到进阶 在编程世界中,排序算法无疑是最基础同时也是最重要的算法之一。它们在数据处理和分析中扮演着关键的角色,无论是在学术研究还是工业应用中都有广泛的用途。在本篇文章中,我们将深入探索Python中的排序算法,从最基本的排序方法到更高级的算法,让你彻底掌握排序算法的原理和实践应用。 阅读详情

相关推荐

算法之Java排序算法:从基础到进阶的全面解析

在编程学习的道路上,排序算法是非常重要的基础内容。今天,咱们一起深入研究Java中的排序算法,从union-find算法的练习与拓展,到初级排序算法的学习,希望能和大家共同进步,提升我们的编程技能!

wj_rdk的博客 1540

数据结构-归并排序-自顶向下

BottomUpSort归并排序,是自底向上的排序 下面介绍一个自顶向上的排序 MergeSort排序,也是一个分治的典例                                 9 4 5 2 1 7 4 6                                 1 2 4 4 5 6 7 9                           1 / 14

DouBoomFly的博客 870

掌握排序算法:从基础到实践

时间复杂度是评估算法效率的主要指标之一,它描述了算法执行时间与输入数据规模之间的关系。在算法理论中,我们通常用大O表示法(Big O notation)来表示时间复杂度,它提供了一个上界,用来描述最坏情况下的运行时间。具体来说,时间复杂度关注的是算法运行次数随着输入规模n的增长而增长的趋势。比如,如果一个算法的运行时间与输入规模n成正比,则我们说这个算法具有线性时间复杂度O(n)。

weixin_30481539的博客 720

算法自底向上合并排序java_自底向上合并排序(BOTTOMUPSORT)

一般地,令A为需要排序的n个元素的数组,首先合并成n/2个连续元素对,生成大小为2的n/2个排序序列,如果剩余一个元素,就让它进入下一轮迭代。然后合并n/4个连续的2元素对的序列,生成n/4个大小为4的排序序列。如果剩余一或两个元素,那么他们将进入下一轮迭代;如果剩余三个元素,将两个(已排序的)元素和另一个元素合并成一个3元素的排序序列。继续这一过程,在第j次迭代中,合并n/(2^j)对大小为2^...

weixin_29310605的博客 924

排序算法比较(选择,插入,自底向上,合并,快速几种排序法)

实现了选择排序(SeletionSort),插入排序(InsertionSort),自底向上排序(BottomupSort),合并排序(MergeSort)和快速排序(QuickSort)

论文阅读《Eigen-GNN: A Graph Structure Preserving Plug-in for GNNs》

好久没看论文了,感觉好生疏 关于这篇文章的大致脉络,这篇文章已经介绍过了。

且视他人之疑目如盏盏鬼火,大胆地去走你的夜路 462

BottomUpSort

算法1.6 BottomUpSort(Page 10) 输入:n个元素的数组A[1…n] 输出:按升序排列的数组A[1…n] t←1 while t<n s←t : t←2s : i←0 while i+t≤n Merge(A,i+1,i+s,i+t) //Merge(A,p,q,r) i←i+t end while if i+s<n...

aaaaaayyyy的博客 967

mmdetection 实战:基于Mask R-CNN与自定义COCO数据集的目标检测全流程解析

本文详细解析了如何使用mmdetection框架和Mask R-CNN模型,基于自定义COCO数据集完成目标检测任务的全流程。内容涵盖环境搭建、数据格式转换、配置文件定制化、模型训练与评估等核心步骤,并提供了针对工业缺陷检测场景的实用调优思路与避坑指南,帮助开发者高效构建高性能检测模型。

weixin_29046611的博客 138

数据结构-归并排序

归并排序(Merging Sort)自底向上合并排序(Bottom Up Sort) 归并的含义是将两个或两个以上的有序表组合成一个新的有序表。 看着好像很麻烦,每次好不容易排好序了,又要合并起来重新排序,那么为什么比较次数会降低呢? 移动方面:大的数自然往后移动,小的数自然的就往前移动,不会做过多的废物移动而浪费时间,从而每一步都是必要的移动。 比较方面:因为每一次移动都是必要的,减少了

DouBoomFly的博客 620

2.1 跟网型控制原理与局限性

本文深入分析了并网变流器的跟网型(GFL)控制技术及其局限性。GFL控制将变流器视为受控电流源,依赖锁相环(PLL)跟踪电网电压,在强电网下表现良好,但在弱电网中面临严峻挑战。研究发现,当电网短路比降低时,PLL动态与电网阻抗的负交互会导致系统失稳,同时GFL变流器缺乏电压支撑能力和惯量响应能力,在故障时易脱网。相比之下,构网型(GFM)控制具有电压源特性,能自主构建电网电压,更适合弱电网环境。随着新能源占比提高,GFL控制正逐渐被更具主动支撑能力的GFM控制所替代。

技术工作者 998

Xshell 连接 VMware虚拟机操作 截图和使用

vmwareVMware总部位于美国加州帕洛阿尔托(Palo Alto),是全球云基础架构和移动商务解决方案厂商,提供基于VMware的解决方案,企业通过数据中心改造和公有云整合业务,借助企业安全转型维系客户信任,实现任意云端和设备上运行、管理、连接及保护任意应用Xshell(安全终端模拟软件)Xshell [1]是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。

小 tom的博客 802

算法(一)--算法分析基本概念

算法设计与分析的第一部分算法伪代码简列

qq_45832614的博客 205

abaqus wcm插件下载_Abaqus随机短纤维增强复合材料建模插件

文末附Abaqus随机短纤维增强复合材料建模插件下载链接前言短纤维增强复合材料相对于长纤维增强复合材料来说更容易制备,且短纤维的填充性能略有改善,可制造复杂产品,广泛应用于车辆、航空航天、建筑等行业,对短纤维增强复合材料进行细观力学分析,可对其宏观力学性能进行预测、分析破坏机理等。接下来对随机短纤维增强复合材料建模插件进行介绍。NO.1 【算法简介】难点一:此插件核心在于判断生成的纤维是...

weixin_39974882的博客 2833

排序算法解析:从基础到高级

排序算法是将一组数据按照特定的顺序重新排列的算法。它们可以根据不同的性能指标进行分类,如时间复杂度、空间复杂度和稳定性。

无远弗届 1056

DMA+Timer 生成 PWM 波形错位问题分析与解决

本文深入分析了DMA与Timer协同生成PWM波形时出现的错位问题,揭示了DMA传输启动时机与定时器溢出中断的微妙关系。通过占空比强制清零法和预装载值调校技巧,提供了有效的解决方案,并总结了PWM+DMA配置的最佳实践,帮助开发者避免类似问题。

weixin_29191081的博客 349

交换机四种光互联技术:OIO、OBO、NPO与CPO

在过去几十年里,数据中心交换机主要依赖电信号通过铜线进行数据传输。然而,随着数据传输速率从100Gbps向400Gbps、800Gbps甚至1.6Tbps迈进,传统电互联(Electrical Input & Output, EIO)面临三大瓶颈:信号衰减、功耗激增和空间限制。例如,高速信号在长距离铜线传输中会产生严重的信号失真,迫使设计者加入数字信号处理器(DSP)来补偿信号衰减,这进一步推高了功耗和成本。此外,传统可插拔光模块的体积较大,限制了端口密度,难以满足现代数据中心对高带宽密度的需求。

网络技术联盟站 3145

算法基础:基本排序算法原理、实现与总结

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。

iOS_Manguoge的博客 1030

【Claude】Invalid API key 无效密钥报错已解决

API 拒绝了你提供的 key。最高频的根因是老的/被撤销的 key 藏在某处自动加载的配置文件里,而你对此不知情。→ 检查所有可能注入 key 的来源(.env.envrc、shell 配置、IDE 设置、)→ 清除无效来源 → 用/status验证。参考:Claude Code 官方《错误参考》"身份验证"章节、社区 Invalid API key 排查记录。

博客 7924

基础数据结构和算法6:简单排序算法

基础数据结构和算法6:简单排序算法1、简单练习1.1 测试框架1.2 随即生成数组1.3 c++内置函数排序2、冒泡排序2.1 步骤(1)首先实现一趟冒泡(2)再实现多趟冒泡2.2 参考代码(1) bubble.c(2) util.c(3) util.h2.3 时间复杂度2.4 空间复杂度3、选择排序3.1 步骤(1)最大数字的下标(2)交换3.2 参考代码(1)selection.c(2)util.c(3)util.h3.3 时间复杂度3.4 空间复杂度3.5 优化4、插入排序4.1 步骤(1)实现插入一

k0512的博客 729

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C++ 排序算法全解析:从基础到实战

在实际开发中,经常需要对自定义类型进行排序。

QY8765的博客 173

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

排序算法总结篇一:基础版排序——选择,插入,冒泡

选择排序 选择排序是一个非常简单且直观的算法,顾名思义,就是每次遍历数组,将其最小或最大(以下举例都是从小到大排序)的以依次放入已排好序的数组,再重复此操作。 动画演示 动画过程解释 第一步遍历无序数组找到最小的数是2 将其与第一个数组交换(此时0-1即为已排序数组) 第二步再次遍历无序数组,找到最小数字是3 ,与第二个数字交换(此时0-2位已排序数组) 以此类推 最终得到一个0-n-1的排序...

段长风 315

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

算法基础:排序算法

一、排序算法 排序算法有很多种,我们只讲最具代表性的几种算法:冒泡排序、希尔排序、归并排序、快速排序。 1.冒泡排序(Bubble Sort) 实现思路: 比较相邻的元素,如果第一个比第二个大,就交换它们两个。 对于每一个相邻元素作同样的比较,从开始的第一对到结尾的最后一对,比较完这一趟,最大的元素会放到(冒泡)到数组最后一位。 每比较完一趟,下一趟比较的数组长度会减一。因为比较完一趟数组之后,后面的最后一个元素是前面元素的最大值,下一轮进行比较没有意义。 持续每次对越来越少的元素重复上面的步骤,直到没

imagine_tion的博客 203

排序算法全景:从基础到高级的Java实现

排序算法是计算机科学中的一个基础概念,它在数据处理和信息检索中扮演着至关重要的角色。本文将通过几个简单的Java程序,带你了解几种常见的排序算法:插入排序、希尔排序、归并排序、快速排序和选择排序,以及一个用于生成和打印测试数据的工具类。

interest_ing_的博客 987

算法基础4:排序算法总结

排序算法的稳定性是一个重要的特性,它描述了排序算法在排序过程中是否会改变具有的元素之间的相对顺序。如果一个排序算法能够保持任何两个相等的元素的先后顺序不变,那么这个排序算法就是稳定的;反之,如果排序过程中可能改变相等元素之间的先后顺序,则该算法是不稳定的。稳定的排序算法对于某些应用场景是非常重要的,特别是当元素的键值不是唯一标识时。

weixin_59409001的博客 551

排序算法:基础入门篇

本章主要讲述了选择排序、冒泡排序和插入排序的思路和实际操作步骤

Krisit的博客 810

基础算法:排序算法

话不多说,上代码 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <random> #include <string.h> #define N 10000500 long long beg; int cnt,n; vo...

diaohan7033的博客 150
上一篇: AJAX进行POST请求,出现403错误
下一篇: MySQL Workbench: You are using safe update mode...
鲲鹏飞九万里
博客等级 码龄10年 177粉丝 350原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值