排序使用多个排序标准(快速排序)的阵列(Sorting an array using multipl

2019-07-03 19:48发布

我试图找出如何(使用快速排序算法)进行排序2个指标分析的结构数组。 例如说我有一个结构:

struct employee{
   char gender[12];
   char name[12];
   int id;
};

说我的输入为:

struct employee arr[3]=
{
    {"male","Matt",1234},
    {"female","Jessica",2345},
    {"male","Josh",1235}
};

我想按性别升序排列元素第一则的ID进行排序。 一个例子是与他们的订单ID首先打印的所有男性,然后将所有与他们的女性。 我试图做到这一点,而无需使用qsort函数,但我还没有如何检查丝毫的想法。 这里是我的排序功能:

void quicksort(struct employee *arr, int left, int right)
{
    int pivot, l, r, temp;
    if(left < right)
    {
        p = left;
        l = left;
        r = right;
        while(l < r)
        {

            while(arr[l].id <= arr[p].id && l <= right)
                l++;
            while(arr[r].id > arr[p].id && r >= left)
                r--;

            if(l < r)
            {
                temp = arr[l].id;
                arr[l].id = arr[r].id;
                arr[r].id = temp;
            }
        }


        temp = arr[r].id;
        arr[r].id = arr[p].id;
        arr[p].id = temp;

        quicksort(arr, left, r-1);
        quicksort(arr, r+1, right);
    }
}

有什么建议? 我想我可以使用STRCMP但我不能找出其中的函数中包含它。

Answer 1:

你当然可以内联的比较函数,并为此事交换技术。 下面这段代码是非常基本的,并且依赖于有效的指针,但you'l的想法。 我也参加了修剪下来的快速排序,固定沿途(我希望)什么是关闭的自由。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// employee record
struct employee
{
    char gender[12];
    char name[12];
    int id;
};

// swap employee records
void swap_employee(struct employee *left, struct employee *right)
{
    struct employee tmp = *right;
    *right = *left;
    *left = tmp;
}

// compare employee records
int compare_employee(const struct employee* left,
                     const struct employee* right)
{
    int gender = strcmp(left->gender, right->gender);
    return (gender ? gender : (left->id - right->id));
}

// quicksort for employees
static void quicksort_(struct employee *arr, int left, int right)
{
    struct employee p = arr[(left+right)/2];    // as good as any
    int l = left, r = right;   // movable indicies

    while (l <= r)
    {
        while (compare_employee(arr+l, &p) < 0)
            ++l;
        while (compare_employee(arr+r, &p) > 0)
            --r;
        if (l <= r)
        {
            swap_employee(arr+l, arr+r);
            ++l; --r;
        }
    }

    if (left < r)
        quicksort_(arr, left, r);
    if (l < right)
        quicksort_(arr, l, right);
}

// exposed API
void quicksort(struct employee *arr, int count)
{
    if (arr && (count>0))
        quicksort_(arr, 0, count-1);
}

/* sample usage */
int main(int argc, char *argv[])
{
    struct employee arr[]=
    {
        {"male","Matt",1234},
        {"female","Jessica",2345},
        {"male","Josh",1235},
        {"female","Betsy",2344},
        {"male","Roger",1233}
    };

    quicksort(arr, sizeof(arr)/sizeof(arr[0]));

    for (int i=0;i<sizeof(arr)/sizeof(arr[0]);++i)
        printf("%s, %s, %d\n", arr[i].gender,arr[i].name, arr[i].id);

    return EXIT_SUCCESS;
}

结果

female, Betsy, 2344
female, Jessica, 2345
male, Roger, 1233
male, Matt, 1234
male, Josh, 1235


Answer 2:

这并不难。 你只需要一个函数(或代码块看到你想要的“硬编码”)来比较你的结构。 在示例代码你给你是比较使用当前对象arr[l].id <= arr[p].id 。 也就是说你只考虑id来找出其中你的元素相符。 你只需要使用其他领域在这一点上比较。 这将是一个功能(我给你在你刚才的问题这样的功能)更为整洁。

你也只能转向ID字段,当你交换 - 留下姓名和性别不变,你的数据项。 你应该将整个结构。



Answer 3:

只需使用内置的qsort ,并通过它,只有在第一次比较“纽带”的情况下,首先比较的性别,并查询ID数进行比较的功能。



Answer 4:

我想你应该按性别排序第一的阵列,一个为男性,一个女性。 然后使用快速排序功能,这两个阵列内的排序。

您可以使用STRCMP原来的数组进行排序成两个阵列:一个男性,一个女性。



Answer 5:

int compare_employee (struct employee * a, struct employee * b) {
    int diff = strcmp(a->gender, b->gender);

    if (diff) // if gender different
        return -diff; // sort descending, please double check this and reverse in case I am wrong

    return a->id - b->id; // else sort by id
}

将输出一个负数,如果a < b正面的,如果a > b ,如果零它们是相等的。

在自己的快速排序或为使用它eigther qsort比较。



文章来源: Sorting an array using multiple sort criteria (QuickSort)