首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

有没有一种方法可以在不分配任何内存的情况下对数组进行排序?

在不分配任何内存的情况下对数组进行排序是一个有趣的问题。通常情况下,排序算法需要对数组进行操作,这通常涉及到在内存中创建额外的数据结构或临时变量。然而,有一些方法可以在不显式分配额外内存的情况下对数组进行排序。

基础概念

  • 原地排序:原地排序算法是指在排序过程中不需要使用额外的存储空间,或者使用的额外存储空间是常数级别的。
  • 稳定排序:如果排序前两个相等的元素在排序后的相对位置不变,则称该排序算法是稳定的。
  • 时间复杂度:衡量算法效率的一个重要指标,表示算法执行所需的时间随输入规模增长的变化趋势。

相关类型

  1. 冒泡排序:通过不断交换相邻的逆序元素来逐步将最大(或最小)的元素移动到数组的一端。
  2. 插入排序:将数组分为已排序和未排序两部分,每次从未排序部分取出一个元素,插入到已排序部分的正确位置。
  3. 选择排序:每次从未排序部分选择最小(或最大)的元素,放到已排序部分的末尾。
  4. 快速排序:通过分治法将数组分为两个子数组,然后递归地对子数组进行排序。
  5. 堆排序:利用堆这种数据结构进行排序,分为建堆和调整堆两个步骤。

应用场景

  • 嵌入式系统:在内存资源非常有限的环境中,原地排序算法可以减少内存占用。
  • 实时系统:在对时间敏感的应用中,原地排序算法通常具有较好的性能表现。

示例代码:快速排序

代码语言:txt
复制
def quicksort(arr, low, high):
    if low < high:
        pi = partition(arr, low, high)
        quicksort(arr, low, pi - 1)
        quicksort(arr, pi + 1, high)

def partition(arr, low, high):
    pivot = arr[high]
    i = low - 1
    for j in range(low, high):
        if arr[j] < pivot:
            i += 1
            arr[i], arr[j] = arr[j], arr[i]
    arr[i + 1], arr[high] = arr[high], arr[i + 1]
    return i + 1

# 示例
arr = [10, 7, 8, 9, 1, 5]
quicksort(arr, 0, len(arr) - 1)
print("排序后的数组:", arr)

参考链接

快速排序算法详解

遇到的问题及解决方法

问题:为什么快速排序在最坏情况下时间复杂度是O(n^2)?

  • 原因:当每次选择的基准元素都是数组中的最小(或最大)元素时,快速排序会退化为类似于冒泡排序的情况。
  • 解决方法:可以通过随机选择基准元素或使用三数取中法来避免最坏情况的发生。

问题:如何在不分配额外内存的情况下实现稳定的排序?

  • 原因:大多数原地排序算法是不稳定的,因为它们可能会改变相等元素的相对位置。
  • 解决方法:可以使用计数排序基数排序,这些算法可以在不分配额外内存的情况下实现稳定排序,但它们通常适用于特定类型的数据(如整数)。

结论

在不分配任何内存的情况下对数组进行排序是可能的,主要通过原地排序算法来实现。选择合适的排序算法取决于具体的应用场景和数据特性。快速排序是一个常见的原地排序算法,但在使用时需要注意其最坏情况下的时间复杂度,并采取相应的优化措施。

相关搜索:有没有一种方法可以在不重新排序JSON对象内部的数组的情况下对其进行排序?有没有一种方法可以在不使用任何迭代的情况下对字符串中的字符进行字母排序?在JAVA中,有没有办法在没有任何数组的情况下对Integer的数字进行排序?JavaScript算法:有没有一种方法可以用元素的绝对值对已经排序的数组进行排序有没有一种方法可以在不指定网站的情况下使用URL进行搜索?有没有一种方法可以在函数内部不返回render的情况下进行突变?有没有一种方法可以在不模仿的情况下测试进行API调用的代码?有没有一种方法可以在不按Ctrl键的情况下在ObjectListView中进行多选?有没有在聚合之前对索引进行排序的方法有没有一种方法可以在不写入文件的情况下获得内存中TinkerGraph的GraphML表示?有没有一种方法可以在不验证选择的情况下使用ChoicePrompt?有没有一种通用的方法可以在不生成“命中”的情况下缩短URL?有没有其他方法可以按'column‘值对3D numpy数组进行排序?有没有一种方法可以在不汇总结果的情况下聚合行?有没有一种方法可以在不拉伸对象拟合的情况下变换比例?在Vala中对默认数组进行排序的简单方法在QML中,有没有一种方法可以在不设置高度的情况下对项目设置anchor.bottom?有没有一种方法可以按子记录关联的最早日期对父记录进行排序?有没有更简洁的方法可以在C#中进行排序?有没有一种方法可以在不传递第一个数组的情况下直接探索数组中的数组?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

c++容器类_类的容器

很简单,容器就是保存其它对象的对象,当然这是一个朴素的理解,这种“对象”还包含了一系列处理“其它对象”的方法,因为这些方法在程序的设计上会经常被用到,所以容器也体现了一个好处,就是“容器类是一种对特定代码重用问题的良好的解决方案...在创建一个vector 后,它会自动在内存中分配一块连续的内存空间进行数据存储,初始的空间大小可以预先指定也可以由vector 默认指定,这个大小即capacity ()函数的返回值。...所以说vector 不是在什么情况下性能都好,只有在预先知道它大小的情况下vector 的性能才是最优的。 vector 的特点: (1) 指定一块如同数组一样的连续存储,但空间可以动态扩展。...list 的特点: (1) 不使用连续的内存空间这样可以随意地进行动态操作; (2) 可以在内部任何位置快速地插入或删除,当然也可以在两端进行push 和pop 。...vector 的查询性能最好,并且在末端增加数据也很好,除非它重新申请内存段;适合高效地随机存储。 list 是一个链表,任何一个元素都可以是不连续的,但它都有两个指向上一元素和下一元素的指针。

82610

CC++工程师面试题(STL篇)

顺序容器 容器并非排序的,元素的插入位置同元素的值无关,包含 vector、deque、list vector:动态数组 元素在内存连续存放。随机存取任何元素都能在常数时间完成。...在尾端增删元素具有较佳的性能。 deque:双向队列 元素在内存连续存放。随机存取任何元素都能在常数时间完成(仅次于 vector )。在两端增删元素具有较佳的性能(大部分情况下是常数时间)。...queue:队列 插入只可以在尾部进行,删除、检索和修改只允许从头部进行,先进先出。 STL 容器用过哪些,查找的时间复杂度是多少,为什么?...空间和内存分配: vector: vector 一次性分配好内存,不够时才进行扩容。 list: list 每次插入新节点都会进行内存申请。...简述 vector 的实现原理 vector 是一种动态数组,在内存中具有连续的存储空间,支持快速随机访问,由于具有连续的存储空间,所以在插入和删除操作方面,效率比较慢。

18600
  • JS 项目中究竟应该使用 Object 还是 Map?| 项目复盘

    在 JavaScript 中,除了最基础的 Object 是该格式外,ES6 新增的 Map 也同样是键值对格式。它们的用法在很多时候都十分接近。不知道有没有人和我一样纠结过该选择哪个去使用呢?...我们可以发现在进行删除操作时,Map 的速度会略占优,但整体差别其实并不大。 特殊情况 其实除了最基本的情况之外,还有一种特殊的情况。还记得我们在前面提到的 Object 中键的排序吗?...负整数作为键的部分会被当成数组对待,即非负整数具有一定的连续性时,会被当成快数组,而过于稀疏时会被当成慢数组。 对于快数组,它拥有连续的内存,所以在进行读写时会更快,且占用更少的内存。...更多的内容可以看一下这: 探究JS V8引擎下的“数组”底层实现 在键为连续非负整数时,性能如下: ? ? 我们可以看到 Object 不仅平均速度更快了,其占用的内存也大大减少了。...,选择 Object,因为它在数据少的时候占用内存更少,且新建时更为高效 需要用到 JSON 进行文件传输时,选择 Object,因为 JSON 不默认支持 Map 需要对多个键值进行运算时,选择 Object

    2K10

    来银行面试了,有点简单?

    首先,需要对内存进行快照,并对快照进行分析,找出哪些对象占用了过多的内存。其次,需要确定这些对象是否可以被垃圾回收。...所有的对象和数组都在堆上进行分配。这部分空间可通过 GC 进行回收。当申请不到空间时会抛出 OutOfMemoryError。堆是JVM内存占用最大,管理最复杂的一个区域。...在JDK1.4 中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O 方式,它可以使用native 函数库直接分配堆外内存,然后通脱一个存储在...归并排序:将数组不断分割为更小的子数组,然后将子数组进行合并,合并过程中进行排序。时间复杂度:最好情况下O(nlogn),最坏情况下O(nlogn),平均情况下O(nlogn)。...对于非字符串变量来说,如果没有对equals()进行重写的话,"==" 和 "equals"方法的作用是相同的,都是用来比较对象在堆内存中的首地址,即用来比较两个引用变量是否指向同一个对象。

    19210

    第一阶段-Java基础知识:【第三章 方法和数组】

    ,从而让开发者使用这个结果 举例更好理解哦:最近有一场周杰伦的演唱会,我通过好多朋友帮忙一起的抢票方法,最后得到了两张票,这两张票就是“抢票”方法的返回值,我(开发者)可以对这个返回值进行任何操作,例如自己去看...❤ 3.2_1 java中的内存分配 Java为了对数据进行空间分配而划分的5个内存空间 栈区(stack area) 函数中定义的基本类型变量,对象的引用变量(对象在堆上的地址)都在函数的栈内存中分配...❤ 3.2_3 For-Each 循环 JDK 1.5 引进了一种新的循环类型,被称为 For-Each 循环或者增强For循环, 它能在不使用下标的情况下遍历数组。 格式: ? ?...冒泡排序只是我们众多排序中的一种比较简单的方法(效率不是很高,但入门必须学习) 其他的排序方法,我们放到板块数据结构与算法中详细讲解 要想对数值型数组进行排序,可以使用Array类中的sort方法 格式...解释: 当基本类型作为形式参数的时候,实际参数(也就是主方法中的10和20)的值传到了 这个方法中,无论其如何操作运算,均只是对被传入的值进行操作,方法结束后即消失, 不会对实际参数有任何的影响 当引用类型作为形式参数的时候

    69420

    数组排序算法大比拼:快排、归并、冒泡哪个更快?

    在快速排序中,通过选择一个基准元素(通常是第一个元素),将整个数组分为两部分:小于基准的在左边,大于基准的在右边。接着,通过递归对左右两部分分别进行排序,最终得到一个有序数组。  ...,可以对一个整数数组进行排序。  ...大规模数据排序但又不能分配足够的内存。归并排序的空间复杂度为O(n),可以在内存受限的情况下完成大规模数据的排序。冒泡排序数据量较小且数组基本有序的情况下。...总结来说,快速排序是最优的选择,在大规模数据排序的情况下性能非常优秀,适用于大多数情况。归并排序适用于处理链表排序和大规模数据排序但又不能分配足够的内存的情况。...归并排序时间复杂度也为O(nlogn),但空间复杂度为O(n),适用于处理链表排序和大规模数据排序但又不能分配足够的内存的情况。

    72621

    Java中堆与栈的两种区别

    栈内存首先是一片内存区域,存储的都是局部变量,凡是定义在方法中的都是局部变量(方法外的是全局变量),for循环内部定义的也是局部变量,是先加载函数才能进行局部变量的定义,所以方法先进栈,然后再定义变量,...数组都是有一个索引,数组这个实体在堆内存中产生之后每一个空间都会进行默认的初始化(这是堆内存的特点,未初始化的数据是不能用的,但在堆里是可以用的,因为初始化过了,但是在栈里没有),不同的类型初始化的值不一样...栈是一种线性结构,所以可以使用数组或链表(单向链表、双向链表或循环链表)作为底层数据结构。...由于堆也是用数组来存储的,故对数组进行堆化后,第一次将A[0]与A[n - 1]交换,再对A[0…n-2]重新恢复堆。...因此,堆排序和快速排序在效率上是差不多的,但是堆排序一般优于快速排序的重要一点是数据的初始分布情况对堆排序的效率没有大的影响。

    1.2K20

    Java集合总览

    Arrays.binarySearch:在一个已排序的或者其中一段中快速查找。 Arrays.copyOf:如果你想扩大数组容量又不想改变它的内容的时候可以使用这个方法。...Arrays.sort:对整个数组或者数组的一部分进行排序。也可以使用此方法用给定的比较器对对象数组进行排序。 Arrays.toString:打印数组的内容。...通常会用这样的方式调用: 1 return coll.toArray( new T[ coll.size() ] ); 这个方法会分配足够大的数组来储存所有的集合,这样 toArray 在返回值时就不必再分配空间了...因此,如果没有首尾元素的话就不能取出任何元素。这个类比LinkedList要好一些,因为它产生的垃圾数量较少(在扩展的时候旧的数组会被丢弃)。 Stack:一种后进先出的队列。...这就是为什么迭代LinkedHashMap的条目(entry)、键和值的时候总是遵循插入的顺序。在JDK中,这是每元素消耗内存最大的集合。 TreeMap:一种基于已排序且带导向信息Map的红黑树。

    1.1K70

    Java集合类型详解

    Arrays.binarySearch:在一个已排序的或者其中一段中快速查找。 Arrays.copyOf:如果你想扩大数组容量又不想改变它的内容的时候可以使用这个方法。...Arrays.sort:对整个数组或者数组的一部分进行排序。也可以使用此方法用给定的比较器对对象数组进行排序。 Arrays.toString:打印数组的内容。...通常会用这样的方式调用: return coll.toArray( new T[ coll.size() ] ); 这个方法会分配足够大的数组来储存所有的集合,这样 toArray 在返回值时就不必再分配空间了...因此,如果没有首尾元素的话就不能取出任何元素。这个类比LinkedList要好一些,因为它产生的垃圾数量较少(在扩展的时候旧的数组会被丢弃)。 Stack:一种后进先出的队列。...这就是为什么迭代LinkedHashMap的条目(entry)、键和值的时候总是遵循插入的顺序。在JDK中,这是每元素消耗内存最大的集合。 TreeMap:一种基于已排序且带导向信息Map的红黑树。

    76320

    十大经典排序算法 -- 动图讲解

    空间复杂度:运行完一个程序所需内存的大小。 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。...针对所有的元素重复以上的步骤,除了最后一个。 4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 ?...作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法: 自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法); 自下而上的迭代; 在《数据结构与算法 JavaScript...使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中 同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。 1. 什么时候最快 当输入的数据可以均匀的分配到每一个桶中。...算法分析 桶排序最好情况下使用线性时间O(n),桶排序的时间复杂度,取决与对各个桶之间数据进行排序的时间复杂度,因为其它部分的时间复杂度都为O(n)。

    1.4K50

    Go 常见算法面试题篇(三):高效调整数组数值顺序

    ,如果换一下排序条件,变成按照是否可以被3整除,或者按照正负数进行排序,则需要重写整个排序方法实现代码。...,排序函数本身无需做任何调整: // 是否是整数(为 true 的值放在后面) func isPositive(num int) bool { return num > 0 } // 是否可以被...,除此之外,我们在第二种解法中还通过指针移动和位运算的方式优化了程序的性能,具体对性能的影响如何,可以编写基准测试来验证: package main import ( "testing" )...此外,还可以加上 -benchmem 选项对比下两种解法的内存分配情况(空间复杂度),由于第一种解法需要引入额外的数组切片存储中间数据,所以显然第二种解法的空间复杂度更优: 可以看到,第一种解法每次要分配...368B 的内存空间,而第二种解法不需要额外分配内存空间。

    45210

    聊聊设计模式之单例模式(上)

    一、单例模式的基础 单例模式的定义是确保某个类在任何情况下都只有一个实例,并且需要提供一个全局的访问点供调用者访问该实例的一种模式。...要确保任何情况下都只有一个实例,则我们需要把创建对象的权限“收回来”或者进行限制,在Java中创建对象最常见的方法就是通过构造方法创建了,因此要做到限制创建对象的权限,就必须将构造方法私有化。...此外又要提供一个全局的访问点,则可以通过public static方法或变量暴露该单例,供外部系统进行访问。...明明在同步块外面已经对singleton对象是否为空做了判断,为何在同步块内部还需要再判断一次呢?之所以这样做,是为了防止在并发的情况下初始化了多个singleton实例。...2跟3重排序后,初始化的过程如下: memory=allocate(); //1.分配对象的内存空间 singleton= memory; //3.设置singleton指向刚分配的内存地址。

    76460

    java基础知识

    另一个优点:禁止指令重排序 final final修饰的变量是常量,必须进行初始化,可以显示初始化,也可以通过构造进行初始化,如果不初始化编译会报错。...、冒泡排序、归并排序、基数排序 插入排序[稳定] 适用于小数组,数组已排好序或接近于排好序速度将会非常快 复杂度:O(n^2) - O(n) - O(n^2) - O(1)[平均 - 最好 - 最坏...只有在方法中使用,不会在方法外可见。 形式参数只能用final修饰符,其它任何修饰符都会引起编译器错误。但是用这个修饰符也有一定的限制,就是在方法中不能对参数做任何修改。...不过一般情况下,一个方法的形参不用final修饰。只有在特殊情况下,那就是:方法内部类。一个方法内的内部类如果使用了这个方法的参数或者局部变量的话,这个参数或局部变量应该是final。...37.Java语言的鲁棒性 Java在编译和运行程序时,都要对可能出现的问题进行检查,以消除错误的产生。它提供自动垃圾收集来进行内存管理,防止程序员在管理内存时容易产生的错误。

    1K50

    那些高频的Python基础面试题

    __new__和__init__的区别是什么?Python中的魔法方法是指可以给我们的类增加魔力的特殊方法。如果对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被调用。...1;当一个对象的引用被销毁时,对象的引用计数减 1;当对 象的引用计数减少为 0 时,就意味着对象已经没有被任何人使用了,可以将其所占用的内存释放了。...虽 然引用计数必须在每次分配和释放内存的时候加入管理引用计数的动作,然而与其他主流的垃圾收集技 术相比,引用计数有一个最大的有点,即“实时性”,任何内存,一旦没有指向它的引用,就会立即被 回收。...而其他的垃圾收集计数必须在某种特殊条件下(比如内存分配失败)才能进行无效内存的回收。...二:10大经典排序算法实现2.1 排序算法总结2.2 冒泡排序算法步骤:1:比较相邻的两个元素,如果第二个比第一个小,就进行两者位置交换。2:对每一对相邻的元素作比较,知道无任何一对元素需要比较。

    79461

    java面试题汇总-基础篇

    2.静态变量在类被加载时就会分配内存空间,就可以使用。实例变量需要实例对象才会分配内存空间,才可以被引用,是属于实例的。 3.静态变量是存在于静态区(全局区)的,实例变量位于堆内存中。...toString()默认输出对象的内存地址,一般不希望输出内存地址可以重写toString()方法。...HashTable在不指定容量的情况下的默认容量为11,而HashMap为16,Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。...java的内存模型规定了所有的变量都存储在主内存中,每个线程拥有自己的工作内存,工作内存保存了该线程使用到的变量的主内存拷贝,线程对变量所有操作,读取,赋值,都必须在工作内存中进行,不能直接写主内存变量...指令重排是指JVM在编译Java代码的时候,或者CPU在执行JVM字节码的时候,对现有的指令顺序进行重新排序。 指令重排的目的是为了在不改变程序执行结果的前提下,优化程序的运行效率。

    80610

    为实习准备的数据结构(1)-- 详尽数组篇

    组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。数组是在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来的一种形式。...3][4]; // 只有第一维可以是变量,其他几维必须都是常量,否则会报错 : delete []value; // 一定要进行内存释放,否则会造成内存泄露 ------- 访问数组元素...即使整个数组只有一个名称,这些元素也可以作为单独的变量进行访问和使用。...cout 的vector size = " << vec.size() << endl; 数组初始化时可以用聚合方法,但是赋值时候不可以用聚合方法。...vector的内部实现一般需要用到placement new ,所以效率很高,因为很多的时候,只要我们是使用得到,就可以省去很多的内存分配开销。

    49300

    分享 Java 常见面试题及答案(上)

    意思就是说,在你写一个 volatile 域时,能保证任何线程都能看到你写的值,同时,在写之前,也能保证任何数值的更新对所有线程是可见的,因为内存屏障会将其他所有写的值更新到缓存。...volatile 变量提供顺序和可见性保证,例如,JVM 或者 JIT为了获得更好的性能会对语句重排序,但是 volatile 类型变量即使在没有同步块的情况下赋值也不会与其他语句重排序。...Busy spin 是一种在不释放 CPU 的基础上等待事件的技术。它经常用于避免丢失 CPU 缓存中的数据(如果线程先暂停,之后在其他CPU上运行就会丢失)。...但是在管理环境下(如 web 服务器)使用线程局部变量的时候要特别小心,在这种情况下,工作线程的生命周期比任何应用变量的生命周期都要长。...java.lang.Cloneable 是一个标示性接口,不包含任何方法,clone 方法在 object 类中定义。

    75720

    面试官初体验

    redis自己实现的内存分配器:在redis中新建key-value值时,redis需要向操作系统申请内存,一般的进程在不需要使用申请的内存后,会直接释放掉、归还内存;但redis不一样,redis在使用完内存后并不会直接归还内存...对初始化的内存大小是最适合的,当这个value改变的并且原来内存大小不适用的时候,就需要重新分配内存了,重新分配之后,就会有一部分内存redis无法正常回收,一直占用着 Redis版本4.0以下 Redis...此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。...如果数组没有排序,可以用 Partition 函数找出数组中的中位数。在没有排序的数组中插入一个数字和找出中位数的时间复杂度是 O(1)和 O(n)。...我们还可以往数组里插入新数据时让数组保持排序,这是由于可能要移动 O(n)个数,因此需要 O(n)时间才能完成插入操作。在已经排好序的数组中找出中位数是一个简单的操作,只需要 O(1)时间即可完成。

    30551

    iOS标准库中常用数据结构和算法之排序

    下面的表格将会从时间复杂度、稳定性、是否需要分配额外内存、是否对有序数组进行优化、 应用范围、平台支持6个维度来考察各种排序函数: 排序算法 时间复杂度 是否稳定 是否需要分配额外内存 是否对有序数组进行优化...快速排序是一种不稳定排序,排序速度最快,平均时间复杂度为O(N*logN),因为其并未对有序数组进行优化处理,因此最差的时间可能是O(N^2)。...heapsort函数是用于堆排序的函数,采用的是J.W.J. William所实现的堆排序算法。堆排序是一种不稳定排序,其时间复杂度比较稳定为O(N*logN)。堆排序对有序数组进行优化处理。...堆排序进行排序时几乎没有附加内存的分配和消耗处理。...mergesort函数是用于归并排序的函数,归并排序是一种稳定的排序,平均时间复杂度为O(N*logN), 因为其对有序数组进行了优化处理,因此最好的时间可能达到O(N)。

    85260

    记一次阿里实习生电面经历

    “这样设计节省内存空间,有时候在某个特定的情况下,我们只需要用的某种特定的类型,如何像结构体那样则浪费了存储空间。...但他其实没等我说完就打断我了 问:“这样当然可以,但是这种方法效率很低,有没有高效的方法” 答:“不会了” 问:“再想半分钟” 答:“真的不会了(对自己也是无语,求网友告知算法)” 4.2 其他算法 问...hash也算一种算法吧,还有排序算法。其他的比如像并查集这种数据结构也算吧。” 关于算法我没敢多提,因为我也怕他深入地问下去,好久没搞算法了,这次没准备,肯定会跪。 不过他也没深入的问下去 5....答:“先判断malloc的内存地址是不是内存对齐的” 问:“如何判断?” 答:“8字节对齐,那么内存地址应该是8的倍数,可以%8(对8求余)” 问:“这会涉及到除法运算,效率比较低。”...内存分配原理 问:“有没有看过内存分配管理的源码?比如malloc之类的。” 答:“没有啊,那大概是汇编吧”(记得大概是Linus说过早期的malloc是用汇编实现的。现在就不知道了。)

    44710
    领券