获得排序后的下标与原始下标关系

java写着写着,吐了,后来想用 js 写,虽然比java还要贫瘠,但至少可以随性些。

/// <summary>
    /// Map orignal indexes to sorted indexes, eg: SI2I([2,5,9,4,6,7])=[0(0,2),3(1,4),1(2,5),4(3,6),5(4,7),2(5,9)].
    /// </summary>
    /// <returns></returns>
    public static int[] SI2I<T>(this List<T> s, Func<T, int> by) {
        var r = new List<int>();
        var t = new List<T>(s);
        while (r.Count < s.Count) {
            var f = 0;
            var v = by(t[0]);
            for (var i = 1; i < t.Count; i++) {
                var n = by(t[i]);
                if (n < v) {
                    f = i;
                    v = n;
                }
            }
            var ts = t[f];
            var ii = s.IndexOf(ts);
            while (r.Contains(ii)) {
                ii = s.IndexOf(ts, ii + 1);
            }
            r.Add(ii);
            t.RemoveAt(f);
        }
        return r.ToArray();
    }

/// <summary>
    /// Map sorted indexes to orignal indexes, see <see cref="SI2I{T}(List{T}, Func{T, int})"/>.
    /// </summary>
    public static int[] I2SI<T>(this List<T> s, Func<T, int> by) {
        return SI2I(SI2I(s, by).ToList(), i => i);
    }
}

时间: 2024-10-18 08:31:22

获得排序后的下标与原始下标关系的相关文章

笔试题:排序后取最小差值数

笔试题:要从5个人中选取2个人作为礼仪,其中每个人的身高范围为160-190,要求2个人的身高差值最小(如果差值相同的话,选取其中最高的两人),以升序输出两个人的身高. Smple input:161 189 167 172 188 Sample outPut: 188 189 public class demo06{ public static void main(String[] args){ int[] arr={161,189,167,172,188};//原始值 //将原始值升序排序

给定一个数组,求如果排序后,相邻两个元素的最大差值,要求时间复杂度为O(N)

第一种方法: 计数排序后,然后找出两两之间的最大差值 计数排序的时间复杂度是O(N) public class CountSort { public static void main(String[] args) { int[] arr = new int[] { 2, 5, 12, 8, 6, 90, 34, 10, 10 }; sort(arr); Arrays.stream(arr).forEach(x -> System.out.print(x + " ")); //计算

输入password登录到主界面,录入学生编号,排序后输出

n 题目:输入password登录到主界面,录入学生编号,排序后输出 n 1.  语言和环境 A.实现语言 C语言 B.环境要求 VC++ 6.0 n 2.  要求 请编写一个C语言程序.将若干学生编号按字母顺序(由小到大)输出. 程序的功能要求例如以下: 1)  输入password"admin",正确则进入主界面,错误则直接推出(exit(0)): 2)从键盘输入5个学生编号"BJS1001","BJS2001"."BJS1011&

c编程:求出4&amp;#215;4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。

//求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和 #include <stdio.h> int main() { int sum=0; int max,min; int max1,max2;//记录最大值的坐标 int min1,min2;//记录最小值的坐标 int i,j; int a[4][4]; //为数组赋值 for(i=0;i<4;i++) { for(j=0;j<4;j++) { scanf("%d",&

已知s.txt文件中有一个这样的字符串 请编写程序读取数据内容,把数据排序后写入 ss.txt文件

package cn.idcast5; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Arrays; /* * 需求:已知s.txt文件中有一个这样

SQL排序后将序号填入指定字段

1.显示行号 如果数据没有删除的情况下主键与行号是一致的,但在删除某些数据,行号就与主键不一致了,这时需要查询行号就需要用新的方法,在SQL Server2005之前,需要使用临时表,但在SQL Server2005中,使用ROW_NUMBER()非常方便. 以下是一个查询语句,意思是按照cid将数据排序,然后将排序后的序号填入新建的字段rowNum. select row_number() over (order by cid) as rowNum,* from t_gene 查询结果: 2.

Javascript 数组自定义排序,并获取排序后的保存原索引的同位数组(堆排序实现)

比如数组A: [ 0: 5, 1: 2, 2: 4, 3: 3, 4: 1 ] 排序后的结果为:[1, 2, 3, 4, 5],但是有时候会有需求想要保留排序前的位置到一个同位数组里,如前例则为:[4, 1, 3, 2, 0],因此就利用堆排序写了一个单独的数组排序过程加以实现. 代码如下: function arrayKeys(arr) { var i = 0, len = arr.length, keys = []; while (i < len) { keys.push(i++); } r

IO流的练习5 —— 读取文件中的字符串,排序后写入另一文件中

需求:已知s.txt文件中有这样的一个字符串:“hcexfgijkamdnoqrzstuvwybpl” 请编写程序读取数据内容,把数据排序后写入ss.txt中. 分析: A:读取文件中的数据 B:把数据存在一个字符串中 C:把字符串转换成字符串数组 D:对字符串数组进行排序 E:数组转换成字符串 F:把字符串写入文件中 1 public static void main(String[] args) throws IOException { 2 // 读取文件中的数据 缓冲字符输入流 3 Buf

将字符串中单词经排序后输出

思路 先将字符串中的单词分割保存至二维数组中,再经排序后输出.水题,直接上代码了. 代码 /************************************************************************* > File Name: words_sort.c > Author: KrisChou > Mail:[email protected] > Created Time: Sun 24 Aug 2014 08:41:42 PM CST *****