代码之家  ›  专栏  ›  技术社区  ›  Nano Taboada

一张好的参考卡/备忘单,上面有C语言的基本排序算法?[关闭]

  •  16
  • Nano Taboada  · 技术社区  · 17 年前

    我一直在寻找一个完美的参考卡片,上面有C语言(或者伪代码)中所有的基本排序算法。维基百科是一个很好的信息来源,但这次我要找的绝对是更便携的(如果可能的话,口袋大小),当然是可打印的。任何建议都将不胜感激!

    5 回复  |  直到 12 年前
        1
  •  43
  •   ephemient    17 年前

    我为一个学习C的朋友做了这个,也许你会发现它很有用:

    #include <stdlib.h>
    #include <string.h>
    
    static void swap(int *a, int *b) {
        if (a != b) {
            int c = *a;
            *a = *b;
            *b = c;
        }
    }
    
    void bubblesort(int *a, int l) {
        int i, j;
    
        for (i = l - 2; i >= 0; i--)
            for (j = i; j < l - 1 && a[j] > a[j + 1]; j++)
                swap(a + j, a + j + 1);
    }
    
    void selectionsort(int *a, int l) {
        int i, j, k;
        for (i = 0; i < l; i++) {
            for (j = (k = i) + 1; j < l; j++)
                if (a[j] < a[k])
                    k = j;
            swap(a + i, a + k);
        }
    }
    
    static void hsort_helper(int *a, int i, int l) {
        int j;
    
        for (j = 2 * i + 1; j < l; i = j, j = 2 * j + 1)
            if (a[i] < a[j])
                if (j + 1 < l && a[j] < a[j + 1])
                    swap(a + i, a + ++j);
                else
                    swap(a + i, a + j);
            else if (j + 1 < l && a[i] < a[j + 1])
                swap(a + i, a + ++j);
            else
                break;
    }
    
    void heapsort(int *a, int l) {
        int i;
    
        for (i = (l - 2) / 2; i >= 0; i--)
            hsort_helper(a, i, l);
    
        while (l-- > 0) {
            swap(a, a + l);
            hsort_helper(a, 0, l);
        }
    }
    
    static void msort_helper(int *a, int *b, int l) {
        int i, j, k, m;
    
        switch (l) {
            case 1:
                a[0] = b[0];
            case 0:
                return;
        }
    
        m = l / 2;
        msort_helper(b, a, m);
        msort_helper(b + m, a + m, l - m);
        for (i = 0, j = 0, k = m; i < l; i++)
            a[i] = b[j < m && !(k < l && b[j] > b[k]) ? j++ : k++];
    }
    
    void mergesort(int *a, int l) {
        int *b;
    
        if (l < 0)
            return;
    
        b = malloc(l * sizeof(int));
        memcpy(b, a, l * sizeof(int));
        msort_helper(a, b, l);
        free(b);
    }
    
    static int pivot(int *a, int l) {
        int i, j;
    
        for (i = j = 1; i < l; i++)
            if (a[i] <= a[0])
                swap(a + i, a + j++);
    
        swap(a, a + j - 1);
    
        return j;
    }
    
    void quicksort(int *a, int l) {
        int m;
    
        if (l <= 1)
            return;
    
        m = pivot(a, l);
        quicksort(a, m - 1);
        quicksort(a + m, l - m);
    }
    
    struct node {
        int value;
        struct node *left, *right;
    };
    
    void btreesort(int *a, int l) {
        int i;
        struct node *root = NULL, **ptr;
    
        for (i = 0; i < l; i++) {
            for (ptr = &root; *ptr;)
                ptr = a[i] < (*ptr)->value ? &(*ptr)->left : &(*ptr)->right;
            *ptr = malloc(sizeof(struct node));
            **ptr = (struct node){.value = a[i]};
        }
    
        for (i = 0; i < l; i++) {
            struct node *node;
            for (ptr = &root; (*ptr)->left; ptr = &(*ptr)->left);
            a[i] = (*ptr)->value;
            node = (*ptr)->right;
            free(*ptr);
            (*ptr) = node;
        }
    }
    
        2
  •  13
  •   Igal Tabachnik    15 年前

    你一定要看看 Animated Sorting Algorithms 页。对于排序算法来说,它是一个令人惊奇的资源。

    编辑 感谢彼得里诺的新链接!

        3
  •  5
  •   BoltBait    17 年前

    你需要的是罗伯特·塞奇威克写的一本书《C语言中的算法》。

    http://www.amazon.com/Algorithms-C-paperback-Robert-Sedgewick/dp/0768682339/

    我可能会找一个旧的。新的有点贵(但仍然完全值得)。

        4
  •  3
  •   Jonathan Leffler    17 年前

    一般来说,人们不太担心不同的算法,许多人使用标准库 qsort() 函数(可能使用或可能不使用快速排序)进行排序。当他们不使用它时,他们通常有更复杂的需求。这可能是因为它们需要外部排序(将数据溢出到磁盘),或者是因为与性能相关的原因。偶尔,与使用 qSO() (或者,实际上, bsearch() )太棒了。有时,人们不想冒险冒流沙的最坏情况,但大多数生产 qSO() 算法将为您避免这种情况。

    除了各种各样的算法书籍之外,Sedgewick就是其中之一,但是还有很多其他的——你也可以看看JonBentley的“编程珍珠”或“更多编程珍珠”书籍。不管怎样,这是很好的——它们很好——但是“更多编程珍珠”还包括一个用awk编写的简单算法库,包括插入排序、堆排序和快速排序。它漏掉了气泡排序、壳排序和博戈斯特排序。它也不包括基数排序。

        5
  •  0
  •   Tim    17 年前