c语言中一个改进的qsort()函数
假设我们使用qsort对一维数组进行排序,是否有一种简单的方法可以从已排序数组的元素中检索该元素在排序之前在数组中被索引时的索引。假设c[N]被排序为d[N],如何从整数i,j中求出c[j]=d[i]?当我指的是一种简单的方法时,带有一些附加参数的qsort是在排序之前的索引之间存储此类信息双射,还是存在一个qsort改进函数,可以轻松地排序和检索此类信息?假设您使用如下结构填充初始数组:c语言中一个改进的qsort()函数,c,sorting,C,Sorting,假设我们使用qsort对一维数组进行排序,是否有一种简单的方法可以从已排序数组的元素中检索该元素在排序之前在数组中被索引时的索引。假设c[N]被排序为d[N],如何从整数i,j中求出c[j]=d[i]?当我指的是一种简单的方法时,带有一些附加参数的qsort是在排序之前的索引之间存储此类信息双射,还是存在一个qsort改进函数,可以轻松地排序和检索此类信息?假设您使用如下结构填充初始数组: struct IndexedInteger { int value; int index; }
struct IndexedInteger {
int value;
int index;
}
然后需要在循环中填充索引:
void addIndices(IndexedInteger * array, size_t num) {
int i;
for (i = 0; i < num; ++i) {
array[i].index = i;
}
}
然后,您将使用初始索引对数组进行排序
免责声明:我写得很快,可能会有错误。假设您使用如下结构填充初始数组:
struct IndexedInteger {
int value;
int index;
}
然后需要在循环中填充索引:
void addIndices(IndexedInteger * array, size_t num) {
int i;
for (i = 0; i < num; ++i) {
array[i].index = i;
}
}
然后,您将使用初始索引对数组进行排序
免责声明:我写得很快,可能会有错误。在本例中,您可以创建一个保存数据的结构,它是一个整数,也是一个整数,对应于它最初在数组中的位置的索引。澄清一下,
#include <stdio.h>
#include <stdlib.h>
struct myData {
int data;
int orig_pos; // will hold the original position of data on your array
};
int myData_compare (const void* a, const void* b) {
return ((struct myData*)a)->data - ((struct myData*)b)->data;
}
int main () {
size_t N = 10; // size of your array
struct myData* array = (struct myData*) malloc(N * sizeof(struct myData));
for (size_t i = 0; i < N; i++) {
array[i].data = N - i; // array will hold 10,9,8,7,...1 in this order
array[i].orig_pos = i;
}
qsort(array, N, sizeof(struct myData), &myData_compare);
for (size_t i = 0; i < N; i++) {
printf("\ndata: %d, orig_pos: %d", array[i].data, array[i].orig_pos);
}
return 0;
}
您可以做的是创建一个结构来保存数据,在本例中是一个整数,也是一个整数,它对应于它最初在数组中的位置的索引。澄清一下,
#include <stdio.h>
#include <stdlib.h>
struct myData {
int data;
int orig_pos; // will hold the original position of data on your array
};
int myData_compare (const void* a, const void* b) {
return ((struct myData*)a)->data - ((struct myData*)b)->data;
}
int main () {
size_t N = 10; // size of your array
struct myData* array = (struct myData*) malloc(N * sizeof(struct myData));
for (size_t i = 0; i < N; i++) {
array[i].data = N - i; // array will hold 10,9,8,7,...1 in this order
array[i].orig_pos = i;
}
qsort(array, N, sizeof(struct myData), &myData_compare);
for (size_t i = 0; i < N; i++) {
printf("\ndata: %d, orig_pos: %d", array[i].data, array[i].orig_pos);
}
return 0;
}
你可以手动操作,我的意思是在排序之前和之后获取索引。。对吗?你说的是posix的qsort3吗?@hroptatyr qsort是C标准库的一部分,posix没有以任何方式改变它的功能。@Daniel是的,我很困惑,因为OP说的是改进版,我打算提供一个具有不同签名的解决方案,这显然不是一个替代方案。你可以手动完成,我的意思是在排序之前和之后获取索引。。对吗?你说的是posix的qsort3吗?@hroptatyr qsort是C标准库的一部分,posix没有以任何方式改变它的功能。@丹尼尔:是的,我很困惑,因为OP说的是一个改进的版本,我打算提供一个具有不同签名的解决方案,这显然不会成为替代品