其他数组中的排序数组,但只有索引

问题描述

我有一个小问题,我有一个数组:

int tab[] = {7,2,6,1,8,5,3,7,2} //index: 0-9

及其it索引=值:

0 = 7,1 = 2,2 = 6,3 = 1,4 = 8,5 = 1,6 = 5,7 = 3,8 = 7,9 = 2,

我想在第二个数组中有第一个数组的排序索引。

int tab2应该是:index = value(第一个数组的索引但已排序):

0 = 3,1 = 5,2 = 1,3 = 9,4 = 7,5 = 6,6 = 2,7 = 0,8 = 8,9 = 4,

我有一个代码可以快速排序,但是它不会对第一个数组进行排序,而是在第二个数组中写一个排序后的索引。

void quicksort(int *tab,int p,int q,int *tb){
    int v=tab[p];
    int i,j,x;
    i=p;
    j=q;
    do
    {
        while(tab[i]<v) i++;
        while(tab[j]>v) j--;
        if(i<=j)
        {
            x=tab[i];
            tab[i]=tab[j];
            tab[j]=x;
            i++;
            j--;
        }
    }
    while(i<=j);
    if(j>p) quicksort(tab,p,tb);
    if(i<q) quicksort(tab,i,q,tb);
}

解决方法

如果使用哪种排序算法并不重要,那么最简单的方法之一就是使用插入排序。

例如

#include <stdio.h>

void insertion_sort( const int a[],size_t n,size_t b[] )
{
    for ( size_t i = 0; i < n; i++ )
    {
        size_t j = i;
        
        for ( ; j != 0 && a[i] < a[b[j-1]]; --j )
        {
            b[j] = b[j-1];
        }
        
        b[j] = i;
    }
}

int main(void) 
{
    enum { N = 10 };
    int a[N] = { 7,2,6,1,8,5,3,7,2 };
    size_t b[N];
    
    insertion_sort( a,N,b );
    
    for ( size_t i = 0; i < N; i++ )
    {
        printf( "%d ",a[b[i]] );
    }
    putchar( '\n' );
    
    return 0;
}

程序输出为

1 1 2 2 3 5 6 7 7 8 

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...