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

有没有可能对一个数组进行排序,只得到位置的返回,而不改变顺序?

基础概念

在计算机科学中,排序是指将一组元素按照特定的顺序重新排列的过程。通常,排序算法会改变元素的原始位置。然而,有时我们只需要知道元素在排序后的位置,而不需要改变元素的实际顺序。

相关类型

  1. 稳定排序:如果排序前两个相等的元素在排序后它们的相对位置不变,则该排序算法是稳定的。
  2. 不稳定排序:如果排序前两个相等的元素在排序后它们的相对位置可能改变,则该排序算法是不稳定的。

应用场景

这种需求在多种场景下都会出现,例如:

  • 数据分析:在不改变原始数据的情况下,了解数据的排序情况。
  • 数据库查询优化:在某些情况下,只需要知道数据的排序位置,而不需要实际排序数据。

解决方法

可以使用一种称为“索引排序”的方法来实现这一需求。具体步骤如下:

  1. 创建一个与原数组长度相同的索引数组。
  2. 对索引数组进行排序,排序的依据是原数组中对应位置的元素值。
  3. 返回排序后的索引数组。

示例代码

以下是一个使用Python实现的示例代码:

代码语言:txt
复制
def get_sorted_indices(arr):
    # 创建索引数组
    indices = list(range(len(arr)))
    
    # 根据原数组的值对索引数组进行排序
    indices.sort(key=lambda i: arr[i])
    
    return indices

# 示例数组
arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]

# 获取排序后的索引
sorted_indices = get_sorted_indices(arr)

print("原数组:", arr)
print("排序后的索引:", sorted_indices)

参考链接

解释

  • 创建索引数组indices = list(range(len(arr))) 创建了一个从0到数组长度减1的索引数组。
  • 排序索引数组indices.sort(key=lambda i: arr[i]) 使用原数组的值作为排序依据对索引数组进行排序。
  • 返回排序后的索引:最终返回排序后的索引数组,而不改变原数组的顺序。

通过这种方法,我们可以得到元素在排序后的位置,而不改变原数组的顺序。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

(一)数组常用API

开始索引, 截取多少个, 要插入元素可以传) 当第二个参数时候直接从开始索引截取到最后一个 直接改变数组 # 五、截取数组值 slice() // 截取数组值 语法:...语法1: 数组.slice(开始索引,结束索引) 当第二个参数时候直接从开始索引截取到最后一个改变数组 # 六、数组排序 sort() // 数组排序 语法1: 数组....sort() 排序方式是按照一位一位来看(先排第一个数据一个数字,以此类推) 直接改变原始数组 返回值: 排序数组...直接改变原始数组 返回值: 排序数组顺序排列 小-->大) var arr = [1, 3, 7, 9, 101, 5]...() 可以查找出数据当中有没有该元素 当然使用indexOf也是可以 区别: indexOf()方法有两个确定,一是不够语义化,他含义是找到参数值一个出现位置,所以要去比较是否不等于-1,表达起来不够直观

26610

pwnable.tw刷题之dubblesort

使用pwntoolschecksec功能对程序执行保护进行检查,发现包括NX在内大部分保护都开启了,这对我们来说并不是一个好消息。 ?...2.2) sort函数分析 在接收完用户所有输入后,程序调用sort函数对用户输入所有数字按照从小到大顺序进行排序。 ?...上图为sort函数代码,算法很简单,是一个典型冒泡排序,重复count次,每次排序将当前最大数放在数组最后,在循环结束后,所有数就从小到大排列了。...但是,由于待排序数组位于栈空间内,当前栈空间大小是有限,这就可以导致栈溢出。循环为数组赋值汇编代码如下: ? 从上图我们可以看出,待排序数组起始位置为esp+0x1c。...这时我们要考虑,有没有什么方法在输入数据时不改变栈上原来数据内容?我尝试着输入非法字符,结果如下: ?

1.6K70
  • JS 数组常用方法归纳

    请注意,该方法创建新数组,而是直接修改原有的 arrayObject。 该方法会改变数组长度。 unshift()  可向数组开头添加一个或更多元素,并返回长度。...push() 方法可把它参数顺序添加到 arrayObject 尾部。它直接修改 arrayObject,不是创建一个数组。...push() 方法和 pop() 方法使用数组提供先进后出栈功能。 该方法会改变数组长度。 reverse()  用于颠倒数组中元素顺序。 该方法会改变原来数组不会创建新数组。...sort()  用于对数组元素进行排序。如果调用该方法时没有使用参数,将按字母顺序数组元素进行排序,说得更精确点,是按照字符编码顺序进行排序。...如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值相对顺序数字。

    2.3K30

    Java之集合初探(一)

    A:长度区别   数组长度固定   集合长度可变 B:内容不同   数组存储是同一种类型元素   集合可以存储不同类型元素 C:元素数据类型问题   数组可以存储基本数据类型,也可以存储引用数据类型...Comparable(一个方法(comparaTo)) Iterator(循环遍历, 3个方法)   返回值boolean hasNext()集合里有没有一个   返回值Object next(...List接口主要实现类包括: ArrayList() : 代表长度可以改变数组。可以对元素进行随机访问,向ArrayList()中插入与删除元素速度慢。 API中介绍初始容量为10。...TreeMap特点在 于,你得到结果是经过排序。TreeMap是唯一带有subMap()方法Map,它可以返回一个子树。 ...Set接口 Set是最简单一种集合。集合中对象按特定方式排序,并且没有重复对象。

    96670

    面试:第一章:java基础各种区别

    底层创建一个长度为10数组,当我们向数组中添加11个元素时,底层会进行扩容,扩容为原来1.5倍 (创建一个数组,长度为原数组长度1.5倍,将原数组复制到新数组中)。...添加数据时,首先调用HashCode方法决定数据存放在数组位置,该位置上没有其他元素, 则将数据直接存放,若该位置上有其他元素,调用equals方法进行比较。...LinkedHashSet特点:继承了HashSet,底层实现原理和HashSet一样,可以安照元素添加顺序进行遍历 根据元素hashCode值来决定元素存储位置,它维护了一张链表该链表记录了元素添加顺序...如果该位置没有其它元素则将(k1,v1)直接放入数组中,如果该位置已经有其它元素(k2,v2),调用k1equals方法和k2进行比较。...TreeMap特点:可以对Key中元素安照指定顺序进行排序 ( 不能对value进行排序) HashTable特点:线程安全 ,不可以存放null,map中key不能重复,如果有重复,后者value

    51510

    JavaScript array对象

    如果传递是一或多个数组,则该方法会将这些数组每一项都添加到结果数组中 如果传递值是不是数组,这些值会被简单添加到数组末尾 注意:该方法不会改变先后数组仅仅会返回被连接数组一个副本。...该方法会改变原来数组不会创建新数组。 语法:arrayObject.reverse() 返回值 颠倒后数组。 reverse() 方法将数组中元素位置颠倒,并返回数组。...返回值 : 对数组引用。请注意,数组在原数组进行排序生成副本。...如果省略,将按字母顺序数组元素进行排序,说得更精确点,是按照字符编码顺序进行排序。要实现这一点,首先应把数组元素都转换成字符串(如有必要),以便进行比较。...firstEl第一个用于比较元素。 secondEl第二个用于比较元素。 返回排序数组。请注意,数组已原地排序,并且不进行复制。

    1.4K00

    setlistmap部分源码解析

    二:数组与集合不同 数组只能存放单一数据类型、集合可以存储和操作数目固定一组数据 所有的JAVA集合都位于 java.util包中 JAVA集合只能存放引用类型(类似int不可以,...使用元素自然顺序对元素进行排序,或者根据创建 set 时提供 Comparator 进行排序,具体取决于使用构造方法。 元素唯一。...对集合进行结构性修改时,modCount都会增加,在初始化迭代器时,modCount值会赋给expectedModCount,在迭代过程中,只要modCount改变了,int expectedModCount...* TreeMap是根据key进行排序,它排序和定位需要依赖比较器或覆写Comparable接口,也因此不需要key覆写hashCode方法和equals方法,就可以排除掉重复key,HashMap...,则如果数组位置没有节点,则创建一个节点并赋值     if ((p = tab[i = (n - 1) & hash]) == null)         tab[i] = newNode(hash

    59110

    setlistmap部分源码解析

    二:数组与集合不同 数组只能存放单一数据类型、集合可以存储和操作数目固定一组数据 所有的JAVA集合都位于 java.util包中 JAVA集合只能存放引用类型(类似int不可以,...使用元素自然顺序对元素进行排序,或者根据创建 set 时提供 Comparator 进行排序,具体取决于使用构造方法。 元素唯一。...对集合进行结构性修改时,modCount都会增加,在初始化迭代器时,modCount值会赋给expectedModCount,在迭代过程中,只要modCount改变了,int expectedModCount...* TreeMap是根据key进行排序,它排序和定位需要依赖比较器或覆写Comparable接口,也因此不需要key覆写hashCode方法和equals方法,就可以排除掉重复key,HashMap...,则如果数组位置没有节点,则创建一个节点并赋值     if ((p = tab[i = (n - 1) & hash]) == null)         tab[i] = newNode(hash

    77710

    Java|Map、List与Set区别

    先简单说下集合和数组区别: 数组是大小固定,并且同一个数组只能存放类型一样数据(基本类型/引用类型),JAVA集合可以存储和操作数目固定一组数据。...有的人想有没有不重复数组,所以有了set。 有人想有自动排序组数,所以有了TreeSet、TreeList、Tree**。 几乎所有的集合都是基于数组来实现。...因为集合是对数组封装,所以数组永远比任何一个集合要快。但任何一个集合,比数组提供功能要多。 1、数组声明了它容纳元素类型,集合声明。这是由于集合以Object形式来存储它们元素。...2、一个数组实例具有固定大小,不能伸缩。集合则可根据需要动态改变大小。 3、数组是一种可读/可写数据结构,没有办法创建一个只读数组。...集合中对象按特定方式排序,并且没有重复对象。

    2.8K130

    Java 集合源码详解

    Java 集合源码详解 集合和数组数组声明了它容纳元素类型,集合声明存储Object类型 可以通过泛型进行规范! 数组是静态一个数组实例具有固定大小,一旦创建了就无法改变容量了。...、且重复 集合中每个元素都有其对应顺序索引。...首先, 创建出一个 数组长度16数组… 当 HashSet 新增一个元素, 首先调用 haseCode() 方法, 方法经过重写, 返回一个哈希值 ** 内部通过某种算法...获得具体存放数组位置...compareTo( obj ); 可以对类对象进行,某种方式排序; 称为:自然排序 实现接口类,对象数组/集合。..., 用于比较两个对象大小 内部操作细节自定义, 返回值 int , Java Arrays类会调用方法使用, 根据返回值给 数组元素重新排位置, 1 往后排 -1小往前 ) 总结: TreeSet

    12810

    JavaScript 数组排序函数sort()使用

    大家好,又见面了,我是你们朋友全栈君。 简介   sort()方法是js中对于数组进行排序函数。其可以方便快捷实现对于数组排序不用我们自己编写排序方法。...  我们明显可以看出其排序结果并没有按照元素数值大小进行排序,而是根据其每个位置上元素字符顺序排列。...所以sort()函数在传参情况下对数字数组也是按照字符顺序排序。...这个匿名函数返回值决定了数组排序结果,现在我们传进去了x,y两个参数(有顺序,x在y前面),如果x>y,则x-y>0,匿名函数返回一个正值,则x,y位置会变换。   ...在参数位置(x,y)不发生改变情况下,想要实现降序,即如果x>y,顺序不变,x<y颠倒顺序,所以在x<y时候,我们要让返回值大于0,所以此时返回值为 y-x。

    2.3K10

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

    题目 今天来看一个考察程序员基本功数组面试题,看起来仍然很简单,不过通过这个题目的不同解法,可以快速检验你是初级程序员还是资深程序员,一起来看下吧: 输入一个整数数组,实现一个函数来调整该数组中数字顺序...,分别用于存储奇数和偶数,然后遍历待排序数组切片,根据是否可以被 2 整除将切片数据分发到偶数和奇数切片,最后将偶数切片数据追加到奇数切片之后作为新切片返回。...,如果换一下排序条件,变成按照是否可以被3整除,或者按照正负数进行排序,则需要重写整个排序方法实现代码。...下面我们从扩展性角度出发,将排序条件抽取出来作为定制闭包参数从外部传入排序函数: // 根据指定闭包对数组切片排序 func reOrderArrayV2(arr []int, orderFunc...或者你还有没有更优解法呢?欢迎通过下面的评论框展示你能力。 (本文完)

    44610

    javascript数组怎么定义_js中数组

    (arr[1]) 赋值方法也很简单,直接给数组对应索引值位置赋值即可与其他编程语言不同是: JavaScript中数组,长度是动态可变,如果学过其他编程语言朋友可能对这一点不是很习惯。...("数组长度: " + length); ---- pop()方法 pop() 方法 弹出 / 删除 数组最后一个元素,并返回弹出元素。.../删除元素为:" + element); console.log("数组长度: " + length); ---- shift()方法 shift() 方法删除数组一个元素,并返回删除元素...:当方法参数为空时,按字典序(即元素 Unicode 编码从小到大排序顺序排序数组元素;当参数为一个匿名函数时,将按匿名函数指定规则排序数组元素。...注意,filter()方法返回一个数组,它满足我们指定要求,这个要求通过传参函数进行解释: var arr = [1, 2, 3, 4, 5]; var new_arr = arr.filter(

    3.1K40

    【Java集合-3】ArrayList简析

    = 0) { // c.toArray返回Object[]时候,则进行数组拷贝 if (elementData.getClass() !...E get(int index) 返回此列表中指定位置元素。 int indexOf(Object o) 返回此列表中首次出现指定元素索引,或如果此列表包含元素,则返回 -1。...boolean isEmpty() 如果此列表中没有元素,则返回 true int lastIndexOf(Object o) 返回此列表中最后一次出现指定元素索引,或如果此列表包含索引,则返回...Object[] toArray() 按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素数组。...T[] toArray(T[] a) 按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素数组返回数组运行时类型是指定数组运行时类型。

    50710

    java面试题-javaSE基础

    Math.round(11.5)返回值是 12,Math.round(-11.5)返回值是-11。 四舍五入原理是在参数上加 0.5 然后进行取整。 数组有没有 length() 方法?...键;LinkedHashMap:是 HashMap 一个子类,保存了记录插入顺序;SortMap 接口:TreeMap,能够把它保存记录根据键排序,默认是键值升序排序)。...区别 : List 集合中对象按照索引位置排序,可以有重复对象,允许按照对象在集合中索引位置检索对象,例如通过list.get(i)方法来获取集合中元素; Map 中一个元素包含一个键和一个值...,成对出现,键对象不可以重复,值对象可以重复; Set 集合中对象按照特定方式排序,并且没有重复对象,但它实现类能对集合中对象按照特定方式排序 HashMap 和 HashTable 有什么区别...在运行时候空间大小是无法随着你需要进行增加和减少改变,当数据两比较大时候,有可能会出现越界情况,数据比较小时候,又有可能会浪费掉内存空间。

    15010

    JavaScript数据结构01 - 数组

    注意:如果参数中提供索引值是一个负值,并不改变其查找顺序,查找顺序仍然是从前向后查询数组。如果抵消后索引值仍小于0,则整个数组都将会被查询。...规定排序顺序。必须是函数。 返回值 对数组引用。请注意,数组在原数组进行排序生成副本。...说明 如果调用该方法时没有使用参数,将按字母顺序数组元素进行排序,说更精确点,是按照字符编码顺序进行排序。要实现这一点,首先应把数组元素都转换成字符串(如有必要),以方便比较。...如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值相对顺序数字。...该方法不会改变现有的数组仅仅会返回被连接数组一个副本。 语法 arrayObject.concat(arrayX,arrayX,......

    1.1K30

    13.2 具体集合

    Map(映射):集合中一个元素包含一对键对象和值对象,集合中没有重复键对象,值对象可以重复。他有些实现类能对集合中键对象进行排序。 ?...13.2.1 链表 从数组中间位置删除一个元素要付出很大代价,因为数组中处于被删除元素之后元素都要向数组前端移动,在数组中间位置插入一个元素也是如此。   ...如果需要对集合进行随机访问,就使用数组或者ArrayList,不是使用链表。...只有两个正整数进行比较时候,才能使用上述方法进行,直接返回它们差值,如果x是一个较大正整数,y是一个绝对值较大负整数,x - y可能会溢出。   ...然而,使用Comparable接口定义排列顺序显然有局限性,对于一个给定类,只能实现这个接口一次。如果在一个集合中需要按照部件编号进行排序,在另一个集合中却要按照描述信息进行排序,该怎么办?

    1.8K90

    【笔记】《C++Primer》—— 第二部分:C++标准库

    9 顺序容器 顺序容器储存顺序不依赖于元素值,而是与元素加入位置相关 ?...stable_sort内部采用稳定排序算法 unique将重复元素移动到容器尾,除了list外不会删除那些被移走元素,返回迭代器指向新容器尾(最后一个不重复元素位置),可以用erase来删除剩余元素...,应尽可能使用 链表类型还额外定义了splice(捻接)算法,将两个链表连接在一起 11 关联容器 关联容器和顺序容器有根本不同,关联容器中元素是按照关键保存和访问不是顺序容器中按照容器位置来保存和访问...find即可,但是如果是重复元素容器,用equal_range是最直接方便方法 无序关联容器是C11才加入新标准容器,本质是一个哈希桶,也就是用哈希函数和==运算符来组织元素,用来方便我们对一组没有明显顺序关系元素提供一个可以在平均时间内进行检索容器...,返回值是指向这个数组一个元素指针,不能对其使用begin等用在数组迭代器操作,也无法使用范围for语句,释放动态数组我们要用delete[]形式 指针型动态数组一样可以由unique_ptr

    60730

    JAVA集合:概述

    当从 ArrayList 中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。...2、TreeSet(TreeMap实现) TreeSet 是使用二叉树原理对新 add() 对象按照指定顺序排序(升序、降序),每增加一个对象都会进行排序,将对象插入二叉树指定位置; Integer...;在覆写 compare() 函数时,要返回相应值才能使 TreeSet 按照一定规则来排序 比较此对象与指定对象顺序。...LinkedHashMap 是 HashMap 一个子类,在 LinkedHashMap 中可以保持两种顺序,分别是插入顺序和访问顺序,这个是可以在 LinkedHashMap 初始化方法中进行指定...相对于访问顺序,按照插入顺序进行编排被使用到场景更多一些,所以默认是按照插入顺序进行编排。

    64930
    领券