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

时间:2020-08-10 19:27:34

标签: arrays c sorting quicksort

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

int tab[] = {7,2,6,1,8,1,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, j,tb);
    if(i<q) quicksort(tab, i, q,tb);
}

1 个答案:

答案 0 :(得分:0)

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

例如

#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, 1, 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