⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 quilist.c

📁 red black tree red black tree
💻 C
字号:
/* quicksort, for linked lists */

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

typedef int T;                  /* type of item to be sorted */

typedef struct listTag {        /* typical node to be sorted */
    struct listTag *next;
    struct listTag *prev;
    T data;
} listNode;

#define compLT(a,b) (a < b)
#define compGT(a,b) (a > b)

listNode *partition(listNode *lb, listNode *rb) {
    T t, pivot;
    listNode *i, *j;
    int done;           /* record if pointers cross (means we're done!) */

   /********************************************************
    * partition list [lb..rb], and return pointer to pivot *
    ********************************************************/

    /* select a pivot */
    pivot = lb->data;
    done = 0;

    /* scan from both ends, swapping when needed */
    /* care must be taken not to address outside [lb..rb] with pointers */
    i = lb; j = rb;
    while(1) {
        while (compGT(j->data, pivot)) {
            j = j->prev;
            if (i == j) done = 1;
        }
        if (done) return j;
        while (compLT(i->data, pivot)) {
            i = i->next;
            if (i == j) done = 1;
        }
        if (done) return j;

        /* swap i, j */
        t = i->data;
        i->data = j->data;
        j->data = t;

        /* examine next element */
        j = j->prev;
        if (i == j) done = 1;
        i = i->next;
        if (i == j) done = 1;
    }
}

void quickSort(listNode *lb, listNode *rb) {
    listNode *m;

   /************************
    *  sort list [lb..rb]  *
    ************************/

    if (lb == rb) return;

    m = partition(lb, rb);

    if (m != lb) quickSort(lb, m);              /* sort left side */
    if (m != rb) quickSort(m->next, rb);        /* sort right side */
}

int main(int argc, char *argv[]) {
    /* command-line:
     *
     *   quilist maxnum
     *
     *   quilist 2000
     *       sorts 2000 records
     *
     */

    listNode *p0;
    int maxnum, i;

    maxnum = atoi(argv[1]);
    if ((p0 = malloc(maxnum * sizeof(listNode))) == 0) {
        fprintf (stderr, "insufficient memory (a)\n");
        exit(1);
    }

    /* initialize list */
    srand(1);
    for (i = 0; i < maxnum; i++) {
        p0[i].next = p0 + i + 1;
        p0[i].prev = p0 + i - 1;
        p0[i].data = rand();
    }

    quickSort(p0, p0 + maxnum-1);

    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -