c - 如何快速排序用户输入

标签 c algorithm sorting quicksort

问题很简单,但我搜索得越多,我就越困惑。我应该从我编写的结构代码中快速排序一个变量。但是,我不明白我应该如何快速排序像 em.fName 这样的变量,如果它在循环的每次迭代中都发生了变化。我查找的每个示例似乎都对 int 变量或预定义的字符数组进行排序。有人能指出我从哪里开始的正确方向和/或用 C 语言举个例子吗?谢谢,非常感谢。我有 posted the full code here 因为我不想弄乱帖子。

    typedef struct EmployeeRecord
    {
    STR21 lName;
    STR11 fName;
    char fullName[33];
    float hrs;
    float pay;
    float dfr;
    float gross;
    float ft;
    float st;
    float ssit;
    float net;

    } EmployeeRecord;

int main(void)
{
    EmployeeRecord em;

    do
    {
        counter++;
        em.dfr = em.ft = em.st = em.ssit = em.gross = em.hrs = em.pay = em.net = ovrtHrs = 0; //initalized to 0 and then changed by function if greater than 0
        printf("Please enter your FIRST name: ");
        scanf("%s",fName);
        printf("Please enter your LAST name: ");
        scanf("%s",lName);
        printf("Enter your payrate: ");
        scanf("%f",&em.pay);
        printf("Please enter your total hours: ");
        scanf("%f",&em.hrs);
        printf("Please enter the amount of deferred earnings: ");
        scanf("%f",&em.dfr);

        strcpy(fullName,lName); // combine last + ", " + first into full
                strcat(fullName,", ");
                strcat(fullName,fName);

        payTotal = payTotal + em.pay;
        dfrTotal = dfrTotal + em.dfr;

        em.gross = grossModule(&em.hrs,em.pay,&ovrtHrs); // call 3.4
        CalculateTaxes(&em.gross,&em.dfr,&em.ft,&em.st,&em.ssit); // call 3.0
        em.net = netModule(&em.gross,&em.ft,&em.st,&em.ssit); // cal 3.5

        hoursTotal = hoursTotal + em.hrs;
        overtimeTotal = overtimeTotal + ovrtHrs; // TOTALS
        grossTotal = grossTotal + em.gross;
        stateTotal = stateTotal + em.st;
        ssiTotal = ssiTotal + em.ssit;
        netTotal = netTotal + em.net;
        fedTotal = fedTotal + em.ft;

        fprintf(myreport,REPORTCOLUMNFORMATS,em.fullName,em.pay,em.hrs,em.gross,em.ft,em.ssit,em.net);
        fprintf(myreport,REPORTCOLUMNFORMATS3,ovrtHrs,em.st,em.dfr);


        printf("Would you like to continue, y/n? \n");
        scanf("%s",&ask);

    }while(ask == 'y' || ask == 'Y');

最佳答案

这里有一些提示:

  1. 您只读取一个 EmployeeRecord,然后它被覆盖,如果您想对它们进行排序,则必须将它们全部保存。您可以使用 realloc 来动态更改保留空间的大小或保持简单:

    EmployeeRecord employees[100]; // will fail if more than 100 employees are added
    ...
    // after em is complete:
    employees[counter++] = em; // remove the other counter++
    
  2. 排序取自 wikibooks.org 并用普通 int 替换指针,使用索引而不是指针数学(更容易理解)并添加您必须填写的比较函数:

    void swap(int a, int b)
    {
        EmployeeRecord tmp = employees[a];
        employees[a] = employees[b];
        employees[b] = tmp;
    }
    
    int compare(int a, int b)
    {
        // return -1 if employees[a] comes before employees[b]
        // return  1 if employees[a] comes after employees[b]
        // return  0 "if they have the same order"
        //           (stable algorithms e.g. mergesort won't change the order of those)
    }
    
    void quicksort(int begin, int end)
    {
        int ptr;
        int split;
        if (end - begin <= 1)
            return;
        ptr = begin;
        split = begin + 1;
        while (++ptr <= end) {
            if (compare(ptr, split) > 0) { // sorts ascending
                swap(ptr, split);
                ++split;
            }
        }
        swap(begin, split - 1);
        quicksort(begin, split - 1);
        quicksort(split, end);
    }
    
  3. 在用户决定不再继续后排序并创建报告。

关于c - 如何快速排序用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31662884/

相关文章:

c - 当满足条件时,本次循环并不结束

添加 Mongoose Embedded 后无法弄清楚如何构建 C 应用程序

c++ - 为什么 Erlang 和其他函数编程语言不是原生 c/c++?

子图组合搜索算法

MYSQL - 按字母顺序对 2 列进行排序,如果第一列为空,则使用第二列

python - Cython 将字符串作为字节传递给 C

algorithm - 找到包含特定边的最小权重循环

java - 优化低于O(n²)的圆内圆检测算法

c++ - vector 排序和删除不起作用

mysql - SQL:将多列合二为一进行排序(只输出)