Qsort - 交替排序顺序

时间:2010-12-27 15:28:23

标签: c algorithm data-structures qsort

我有一个使用(并且必须继续使用)实现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

4 个答案:

答案 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)

  1. 预处理:将偶数字符串放入列表中(让我们调用此列表_evens_)并将奇数字符串放在单独的列表中(称为_odds _)
  2. 对两个列表进行排序
  3. 创建目的地列表
  4. 将_odds_列表视为堆栈:弹出_odds_的顶部并将弹出的元素放在目标列表的* front *上。
  5. 将_evens_视为队列:弹出_evens_的顶部,并将弹出的元素放在目标列表的* end *处。