我有一个使用(并且必须继续使用)实现qsort的旧排序功能的程序。我还必须为排序函数提供适当的数据来对数据进行排序(如果字符串包含偶数)或降序(如果字符串包含奇数)。
必须更改数据才能实现此目的,不能改变排序功能。
代码是用 C 编写的,但我没有针对此特定问题的相关代码段。
真正的问题是:
如何转换数据以使输出与下面所需的输出相匹配?
我有以下数据(或类似)
String 1 String 2 String 3 String 4 String 5 String 6
编辑:数据是一些字符串类型char **,每个字符串中的数字是一个int。
所需的输出是
String 5 String 3 String 1 String 2 String 4 String 6
排序通常以与输入1:1匹配的降序方式完成。我设法通过在字符串后面的数字前加1或0来产生一个转换,呈现以下输出。
因此要排序的内部数据如下所示
String 01 String 12 String 03 String 14 String 05 String 16
这会产生以下输出(转换仅用于排序,并且是临时的)。
String 1 String 3 String 5 String 2 String 4 String 6
答案 0 :(得分:3)
你应该有一个包含数据和值的结构:
Struct DataValue
{
string data;
int value;
}
赞{"01", 1}
然后按值和输出数据排序,
如果你想做通常的排序,排序并不难:
首先按值排序,使列表与您显示的一样。 (对于价值观)
现在创建一个空的数组值数组(具有基本数组大小),从最后一项开始并填写如下:
int j = 0;
for (int i = a.Count - 1; i >= 0; i -= 2) // fill bottom of list
{
b[a.Count - 1 - j] = a[i];
j++;
}
j = 0;
for (int i = a.Count - 2; i >= 0; i -= 2) // fill root of list
{
b[j] = a[i];
j++;
}
最后输出值。
我用c#写的它在c中没有太大的不同。 你会得到:
List<int> a = new List<int>{1,2,3,4,5,6,7};
b==> 6,4,2,1,3,5,7
and for:
List<int> a = new List<int>{1,2,3,4,5,6};
b==> 5,3,1,2,4,6
答案 1 :(得分:2)
这可以使用自定义比较例程就地完成(即使用单个数组值而不需要单独的列表)。下面的函数假定您直接对字符串进行排序。预处理数据可能更好,这样您就可以从字符串中提取数字并将它们放入结构中。但这会给你一个想法。
您可以将指向此比较函数的指针传递给qsort
。
int Comparer(void * v1, void * v2)
{
char *s1 = (char *)v1;
char *s2 = (char *)v2;
// Here, extract the numbers from the ends of the strings.
int n1 = // extract number
int n2 = // extract number
// First comparison sorts odd numbers above even numbers
if ((n1 % 2) == 1)
{
// first number is odd
if ((n2 % 2) == 1)
{
// second number is odd, so sort the numbers ascending
return (n1 - n2);
}
else
{
// second number is even, which is "greater than" any odd number
return -1;
}
}
else
{
// first number is even
if ((n2 % 2) == 0)
{
// second number is even, so sort the numbers descending
return (n2 - n1);
}
else
{
// second number is odd, which is "less than" any even number
return 1;
}
}
}
答案 2 :(得分:1)
如果9-i
是奇数,则前置i
。除此之外还有9个。
答案 3 :(得分:1)