所以我有两个数组(实际上是指针),我们称之为a
和b
。我想首先对a
进行排序,然后保存我所做的完全交换以获取排序的数组并将它们应用于我的向量b
。这是我的意思的简短例子:
int *a, *b;
//appropriate mallocs
a[0] = 2; a[1] = 3; a[2] = 1;
b[0] = 4; b[1] = 2; b[2] = 3;
//sort a in decreasing order --> a==[3, 2, 1]
//sort b based on sorting of a --> b==[2, 4, 3]
如何在不编写自己的排序功能的情况下实现这一目标?
答案 0 :(得分:6)
此示例执行原始问题所要求的内容,它以相同的方式对两个(或更多)数组进行排序,而不必将数组元素组合到一个公共结构中。
它使用一个指针数组,因此compare函数不需要知道它正在排序的数组,只需要知道要排序的元素的类型。可以修改它以根据其中一个数组对多个数组进行排序。
它创建一个指向private T SaveChangesWrapper<T>(Func<T> function)
{
try
{
//do some work up front....
return function();
}
catch (DbEntityValidationException ex)
{
//parse exception and rethrow...
}
catch (DbUpdateConcurrencyException ex)
{
//parse and rethrow...
}
catch (DbUpdateException ex)
{
//parse and rethrow...
}
catch (Exception ex)
{
//parse and rethrow..
}
}
的指针数组,使用a[]
根据qsort()
对指针数组进行排序,然后使用排序指针重新排序a[]
和a[]
就位(副作用是排序指针恢复到初始状态)。
重新排序时间复杂度为O(n),因为每个商店将元素放置在其排序位置。
b[]
答案 1 :(得分:4)
更好的解决方案是将数据分组到一个结构数组中,然后根据所需的键(即a
值)对其进行排序:
struct my_data {
int a;
int b;
};
struct my_data data[100];
static int data_cmp(const void *a, const void *b)
{
const struct my_data *da = a, *db = b;
return da->a < db->a ? -1 : da->a > db->a;
}
qsort(data, sizeof data / sizeof *data, sizeof *data, data_cmp);
这使用qsort()
进行排序,这通常是非常需要的。
答案 2 :(得分:1)
这不能按要求解决,排序功能不会公开他们执行的掉期。
但是,结果似乎可以用结构来实现。
struct combined {
int a_;
int b_;
};
qsort
函数测试a_
元素,同时对b_
数据进行排序。
同样,这需要比较功能
int compare( const void * l, const void * r )
{
struct combined * _l= (struct combined *)l;
struct combined * _r= (struct combined *)r;
if( _l->a_ > _r->a_ ) return -1; // reverse sort
if( _l->a_ < _r->a_ ) return 1;
return 0;
}
终于
struct combined array[] = { {2,4}, {3,2}, {1,3} };
qsort( array, 3, sizeof( struct combined), compare );
array => { {3,2}, {2,4}, {1,3} };
答案 3 :(得分:0)
// i am going to submit the idea not the code.
int *a,*b;
int *ord; // an array that holds indexes (sorting orders)
//...
a[ord[0]] = 2; a[ord[1]] = 3; a[ord[2]] = 1;
b[ord[0]] = 4; b[ord[1]] = 2; b[ord[2]] = 3;
//...
//now you have just to sort the indexes array ord