我有一个小问题,我有一个数组:
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);
}
答案 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