经典排序算法实验复杂性分析

来源:互联网 发布:iphone免费阅读软件 编辑:程序博客网 时间:2024/06/05 17:33

十大经典排序算法:冒泡排序,插入排序,选择排序,归并排序,希尔排序(插入排序的变形),快速排序,堆排序, 计数排序,基数排序,桶排序。

理论上的分析各类算法的复杂性:

(1)冒泡排序:平均(期望)运行时间:O(n^2);最好(输入是排好序的数组)运行时间:O(n^2);最差(输入是逆序的数组)运行时间:O(n^2)。一般实际应用中会选择修改的冒泡排序,这种情况下最好运行时间是O(n^2)。

(2)插入排序:平均(期望)运行时间:O(n^2);最好(输入是排好序的数组)运行时间:O(n);最差(输入是逆序的数组)运行时间:O(n^2)。在最好的情况每个插入要求常量时间。

(3)选择排序:平均(期望)运行时间:O(n^2);最好(输入是排好序的数组)运行时间:O(n^2);最差(输入是逆序的数组)运行时间:O(n^2)。即使是完美的排好序的输入也要求扫描整个数组。

(4)归并排序:平均(期望)运行时间:O(n*log(n));最好(输入是排好序的数组)运行时间:O(n*(log(n));最差(输入是逆序的数组)运行时间:O(n*(log(n))。使用数组存储数据时需要O(n)的存储空间,使用链表时常量的存储空间。

(5)希尔排序:使用高纳德(1973)的增量序列[1, 4, 13, 40, 121...] 最差(输入是逆序的数组)运行时间:O(n^1.5)。不稳定排序。

(6)快速排序:平均(期望)运行时间:O(n*log(n));最好(输入是排好序的数组)运行时间:O(n*(log(n));最差(输入是逆序的数组)运行时间:O(n^2)。

(7)堆  排  序:平均(期望)运行时间:O(n*log(n));最好(输入是排好序的数组)运行时间:O(n*(log(n));最差(输入是逆序的数组)运行时间:O(n*(log(n));堆排序与待排数的初始位置无关。不稳定排序。

(8)计数排序:平均(期望)运行时间:O(n);最好(输入是排好序的数组)运行时间:O(n);最差(输入是逆序的数组)运行时间:O(n)。

(9)基数排序:平均(期望)运行时间:O(n);最好(输入是排好序的数组)运行时间:O(n);最差(输入是逆序的数组)运行时间:O(n)。

(10)桶  排  序:平均(期望)运行时间:O(n);最好(输入是排好序的数组)运行时间:O(n);最差(所有待排序的数被散列到一个桶中)运行时间:O(n^2)。

    使用的两个测试数据文件分别是FNRandomNum.txt和SNRandomNum.txt,其大小分别是10000, 30000;最初计划使用三个数据集10000, 100000, 1000000,其中使用1000000的数据集时对内存要求为常量的冒泡排序在win7,32位,4 GB RAM的Core 2主机上无法装载运行。同时对100000大小的数据集使用归并排序算法时内存无法装载,为了使实验结果更具对比性,第二个使用了30000大小的数据集,以确保所有排序算法在现有主机上都可以运行。

生成测试 .txt文件

#include <stdio.h>#include <stdlib.h>#define FN 10000#define TN 30000#define SN 100000main(){    int i, c;    unsigned long x;    FILE *frofp, *srofp, *trofp;    frofp = fopen("FNRandomNum.txt", "w");    srand((unsigned)time(NULL));    for (i = 0; i < FN; i++) {        c = rand();        if (i != 0 && i % 15 == 0)            putc('\n', frofp);        fprintf(frofp, "%10d", c);    }    fclose(frofp);    srofp = fopen("SNRandomNum.txt", "w");    srand((unsigned)time(NULL));    for (i = 0; i < SN; i++) {        c = rand();        c <<= 15;        c ^= rand();        c %= 100001;        if (i != 0 && i % 15 == 0)            putc('\n', srofp);        fprintf(srofp, "%10d", c);    }    fclose(srofp);    trofp = fopen("TNRandomNum.txt", "w");    srand((unsigned)time(NULL));    for (i = 0; i < TN; i++) {        x = rand();        x %= 30001;        if (i != 0 && i % 15 == 0)            putc('\n', trofp);        fprintf(trofp, "%10d", x);    }    fclose(trofp);    return 0;}

1、冒泡排序bubble sort 

#include <stdio.h>#include <stdlib.h>#include <time.h>#define FN 10000#define SN 30000#define NELEMS(x) (sizeof(x) / sizeof(x[0]))void BubbleSort(int [], int);void BucketSort(int [], int);main(){    int c, i, len, fr[FN], vr[FN],                   sfr[SN], svr[SN];    double spent;    FILE *fifp, *sifp, *fofp, *sofp;    clock_t tic, toc;    i = 0;    fifp = fopen("FNRandomNum.txt", "r");    fscanf(fifp, "%d", &c);    while (!feof(fifp)) {        fr[i++] = c;        fscanf(fifp, "%d", &c);    }    fr[i] = c;    fclose(fifp);    i = 0;    sifp = fopen("TNRandomNum.txt", "r");    fscanf(sifp, "%d", &c);    while (!feof(sifp)) {        sfr[i++] = c;        fscanf(sifp, "%d", &c);    }    sfr[i] = c;    fclose(sifp);    tic = clock();    BubbleSort(fr, FN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("BubbleSort:\n");    printf("\t%10d elements average running time: %f seconds\n", FN, spent);    tic = clock();    BubbleSort(fr, FN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements best running time: %f seconds\n", FN, spent);    for (i = 0; i < FN; i++)        vr[i] = fr[FN - 1 - i];    tic = clock();    BubbleSort(vr, FN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements worst running time: %f seconds\n", FN, spent);    tic = clock();    BubbleSort(sfr, SN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements average running time: %f seconds\n", SN, spent);    tic = clock();    BubbleSort(sfr, SN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements best running time: %f seconds\n", SN, spent);    for (i = 0; i < SN; i++)        svr[i] = sfr[SN - 1 - i];    tic = clock();    BubbleSort(svr, SN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements worst running time: %f seconds\n", SN, spent);    return 0;}void BubbleSort(int a[], int len){    int i, j, temp;    for (i = 0; i < len - 1; i++) {        for (j = len - 1; j > i; j--) {            if (a[j] < a[j-1]) {                temp = a[j];                a[j] = a[j-1];                a[j-1] = temp;            }        }    }}



2、插入排序 insertion sort

#include <stdio.h>#include <stdlib.h>#include <time.h>#define FN 10000#define SN 30000#define NELEMS(x) (sizeof(x) / sizeof(x[0]))void InsertionSort(int [], int);main(){    int c, i, len, fr[FN], vr[FN],                   sfr[SN], svr[SN];    double spent;    FILE *fifp, *sifp, *fofp, *sofp;    clock_t tic, toc;    i = 0;    fifp = fopen("FNRandomNum.txt", "r");    fscanf(fifp, "%d", &c);    while (!feof(fifp)) {        fr[i++] = c;        fscanf(fifp, "%d", &c);    }    fr[i] = c;    fclose(fifp);    i = 0;    sifp = fopen("TNRandomNum.txt", "r");    fscanf(sifp, "%d", &c);    while (!feof(sifp)) {        sfr[i++] = c;        fscanf(sifp, "%d", &c);    }    sfr[i] = c;    fclose(sifp);    tic = clock();    InsertionSort(fr, FN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("InsertionSort:\n");    printf("\t%10d elements average running time: %f seconds\n", FN, spent);    tic = clock();    InsertionSort(fr, FN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements best running time: %f seconds\n", FN, spent);    for (i = 0; i < FN; i++)        vr[i] = fr[FN - 1 - i];    tic = clock();    InsertionSort(vr, FN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements worst running time: %f seconds\n", FN, spent);    tic = clock();    InsertionSort(sfr, SN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements average running time: %f seconds\n", SN, spent);    tic = clock();    InsertionSort(sfr, SN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements best running time: %f seconds\n", SN, spent);    for (i = 0; i < SN; i++)        svr[i] = sfr[SN - 1 - i];    tic = clock();    InsertionSort(svr, SN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements worst running time: %f seconds\n", SN, spent);    return 0;}void InsertionSort(int a[], int len){    int i, j, key;    for ( j = 1; j < len; j++) {        key = a[j];        i = j - 1;        while (i >= 0 && a[i] > key) {            a[i+1] = a[i];            i = i - 1;        }        a[i+1] = key;    }}


3、选择排序 selection sort

#include <stdio.h>#include <stdlib.h>#include <time.h>#define FN 10000#define SN 30000#define NELEMS(x) (sizeof(x) / sizeof(x[0]))void SelectionSort(int [], int);main(){    int c, i, len, fr[FN], vr[FN],                   sfr[SN], svr[SN];    double spent;    FILE *fifp, *sifp, *fofp, *sofp;    clock_t tic, toc;    i = 0;    fifp = fopen("FNRandomNum.txt", "r");    fscanf(fifp, "%d", &c);    while (!feof(fifp)) {        fr[i++] = c;        fscanf(fifp, "%d", &c);    }    fr[i] = c;    fclose(fifp);    i = 0;    sifp = fopen("TNRandomNum.txt", "r");    fscanf(sifp, "%d", &c);    while (!feof(sifp)) {        sfr[i++] = c;        fscanf(sifp, "%d", &c);    }    sfr[i] = c;    fclose(sifp);    tic = clock();    SelectionSort(fr, FN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("SelectionSort:\n");    printf("\t%10d elements average running time: %f seconds\n", FN, spent);    tic = clock();    SelectionSort(fr, FN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements best running time: %f seconds\n", FN, spent);    for (i = 0; i < FN; i++)        vr[i] = fr[FN - 1 - i];    tic = clock();    SelectionSort(vr, FN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements worst running time: %f seconds\n", FN, spent);    tic = clock();    SelectionSort(sfr, SN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements average running time: %f seconds\n", SN, spent);    tic = clock();    SelectionSort(sfr, SN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements best running time: %f seconds\n", SN, spent);    for (i = 0; i < SN; i++)        svr[i] = sfr[SN - 1 - i];    tic = clock();    SelectionSort(svr, SN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements worst running time: %f seconds\n", SN, spent);    return 0;}void SelectionSort(int a[], int len){    int i, j, mi, key, temp;    for (i = 0; i < len - 1; i++) {        mi = a[i];        key = i;        for (j = i + 1; j < len; j++) {            if (a[j] < mi) {                mi = a[j];                key = j;            }        }        temp = a[i];        a[i] = a[key];        a[key] = temp;    }}


4、归并排序merge sort

#include <stdio.h>#include <stdlib.h>#include <limits.h>#include <time.h>#define FN 10000#define SN 30000#define NELEMS(x) (sizeof(x) / sizeof(x[0]))void MergeSort(int [], int, int);void Merge(int [], int, int, int);main(){    int c, i, low, fr[FN], vr[FN],                   sfr[SN], svr[SN];    double spent;    FILE *fifp, *sifp, *fofp, *sofp;    clock_t tic, toc;    i = 0;    low = 0;    fifp = fopen("FNRandomNum.txt", "r");    fscanf(fifp, "%d", &c);    while (!feof(fifp)) {        fr[i++] = c;        fscanf(fifp, "%d", &c);    }    fr[i] = c;    fclose(fifp);    i = 0;    sifp = fopen("TNRandomNum.txt", "r");    fscanf(sifp, "%d", &c);    while (!feof(sifp)) {        sfr[i++] = c;        fscanf(sifp, "%d", &c);    }    sfr[i] = c;    fclose(sifp);    tic = clock();    MergeSort(fr, low, FN-1);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("MergeSort:\n");    printf("\t%10d elements average running time: %f seconds\n", FN, spent);    tic = clock();    MergeSort(fr, low, FN-1);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements best running time: %f seconds\n", FN, spent);    for (i = 0; i < FN; i++)        vr[i] = fr[FN - 1 - i];    tic = clock();    MergeSort(vr, low, FN-1);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements worst running time: %f seconds\n", FN, spent);    tic = clock();    MergeSort(sfr, low, SN-1);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements average running time: %f seconds\n", SN, spent);    tic = clock();    MergeSort(sfr, low, SN-1);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements best running time: %f seconds\n", SN, spent);    for (i = 0; i < SN; i++)        svr[i] = sfr[SN - 1 - i];    tic = clock();    MergeSort(svr, low, SN-1);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements worst running time: %f seconds\n", SN, spent);    return 0;}void MergeSort(int a[], int p, int r){    int q;    if (p < r) {        q = (p + r) / 2;        MergeSort(a, p, q);        MergeSort(a, q + 1, r);        Merge(a, p, q, r);    }}void Merge(int a[], int p, int q, int r){    int n1, n2, i, j, k;    n1 = q - p + 1;    n2 = r - q;    int ri[n1+1], lf[n2+1];    for (i = 0; i < n1; i++)        ri[i] = a[p + i];    for (j = 0; j < n2; j++)        lf[j] = a[q + j + 1];    ri[n1] = INT_MAX;    lf[n2] = INT_MAX;    i = 0;    j = 0;    for (k = p; k <= r; k++) {        if (lf[j] <= ri[i]) {            a[k] = lf[j];            j++;        } else {            a[k] = ri[i];            i++;        }    }}



5.希尔排序(shell sort)

#include <stdio.h>#include <stdlib.h>#include <time.h>#define FN 10000#define SN 30000#define NELEMS(x) (sizeof(x) / sizeof(x[0]))void ShellSort(int [], int);int power(int, int);main(){    int c, i, len, fr[FN], vr[FN],                   sfr[SN], svr[SN];    double spent;    FILE *fifp, *sifp, *fofp, *sofp;    clock_t tic, toc;    i = 0;    fifp = fopen("FNRandomNum.txt", "r");    fscanf(fifp, "%d", &c);    while (!feof(fifp)) {        fr[i++] = c;        fscanf(fifp, "%d", &c);    }    fr[i] = c;    fclose(fifp);    i = 0;    sifp = fopen("TNRandomNum.txt", "r");    fscanf(sifp, "%d", &c);    while (!feof(sifp)) {        sfr[i++] = c;        fscanf(sifp, "%d", &c);    }    sfr[i] = c;    fclose(sifp);    tic = clock();    ShellSort(fr, FN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("ShellSort:\n");    printf("\t%10d elements average running time: %f seconds\n", FN, spent);    tic = clock();    ShellSort(fr, FN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements best running time: %f seconds\n", FN, spent);    for (i = 0; i < FN; i++)        vr[i] = fr[FN - 1 - i];    tic = clock();    ShellSort(vr, FN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements worst running time: %f seconds\n", FN, spent);    tic = clock();    ShellSort(sfr, SN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements average running time: %f seconds\n", SN, spent);    tic = clock();    ShellSort(sfr, SN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements best running time: %f seconds\n", SN, spent);    for (i = 0; i < SN; i++)        svr[i] = sfr[SN - 1 - i];    tic = clock();    ShellSort(svr, SN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements worst running time: %f seconds\n", SN, spent);    return 0;}void ShellSort(int a[], int len){    int i, gap, j, k, temp, itv, key;    key = 1;    do {        itv = (power(3, key) - 1) / 2;        key++;    }while (itv < ((float)len) / 3.0f + 0.5f);    key -= 2;    int in[key];    for (i = key; i > 0; i--) {        gap = (power(3, i) - 1) / 2;        for (j = gap; j < len; j++) {            temp = a[j];            for (k = j; j >= gap && a[j] < a[j-gap]; j = j - gap)                a[j] = a[j-gap];            a[j] = temp;        }    }}int power(int base, int exp){    int i, pro;    pro = 1;    for (i = 0; i < exp; i++)        pro *= base;    return pro;}


6.快速排序(quick sort)

#include <stdio.h>#include <stdlib.h>#include <time.h>#define FN 10000#define SN 30000#define NELEMS(x) (sizeof(x) / sizeof(x[0]))void QuickSort(int [], int, int);int Partion(int [], int, int);main(){    int c, i, low, fr[FN], vr[FN],                   sfr[SN], svr[SN];    double spent;    FILE *fifp, *sifp, *fofp, *sofp;    clock_t tic, toc;    i = 0;    low = 0;    fifp = fopen("FNRandomNum.txt", "r");    fscanf(fifp, "%d", &c);    while (!feof(fifp)) {        fr[i++] = c;        fscanf(fifp, "%d", &c);    }    fr[i] = c;    fclose(fifp);    i = 0;    sifp = fopen("TNRandomNum.txt", "r");    fscanf(sifp, "%d", &c);    while (!feof(sifp)) {        sfr[i++] = c;        fscanf(sifp, "%d", &c);    }    sfr[i] = c;    fclose(sifp);    tic = clock();    QuickSort(fr, low, FN-1);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("QuickSort:\n");    printf("\t%10d elements average running time: %f seconds\n", FN, spent);    tic = clock();    QuickSort(fr, low, FN-1);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements best running time: %f seconds\n", FN, spent);    for (i = 0; i < FN; i++)        vr[i] = fr[FN - 1 - i];    tic = clock();    QuickSort(vr, low, FN-1);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements worst running time: %f seconds\n", FN, spent);    tic = clock();    QuickSort(sfr, low, SN-1);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements average running time: %f seconds\n", SN, spent);    tic = clock();    QuickSort(sfr, low, SN-1);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements best running time: %f seconds\n", SN, spent);    for (i = 0; i < SN; i++)        svr[i] = sfr[SN - 1 - i];    tic = clock();    QuickSort(svr, low, SN-1);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements worst running time: %f seconds\n", SN, spent);    return 0;}void QuickSort(int a[], int p, int r){    int q;    if (p < r) {        q = Partion(a, p, r);        QuickSort(a, p, q - 1);        QuickSort(a, q + 1, r);    }}int Partion(int a[], int p, int r){    int i, j, temp;    i = p - 1;    for (j = p; j < r; j++) {        if (a[j] <= a[r]) {            i++;            temp = a[j];            a[j] = a[i];            a[i] = temp;        }    }    temp = a[i+1];    a[i+1] = a[r];    a[r] = temp;    return i+1;}



7.堆排序(heap sort)

#include <stdio.h>#include <stdlib.h>#include <time.h>#define FN 10000#define SN 30000#define NELEMS(x) (sizeof(x) / sizeof(x[0]))void HeapSort(int[], int);void BuildMaxHeap(int [], int);void MaxHeap(int [], int, int);main(){    int c, i, len, fr[FN], vr[FN],                   sfr[SN], svr[SN];    double spent;    FILE *fifp, *sifp, *fofp, *sofp;    clock_t tic, toc;    i = 0;    fifp = fopen("FNRandomNum.txt", "r");    fscanf(fifp, "%d", &c);    while (!feof(fifp)) {        fr[i++] = c;        fscanf(fifp, "%d", &c);    }    fr[i] = c;    fclose(fifp);    i = 0;    sifp = fopen("TNRandomNum.txt", "r");    fscanf(sifp, "%d", &c);    while (!feof(sifp)) {        sfr[i++] = c;        fscanf(sifp, "%d", &c);    }    sfr[i] = c;    fclose(sifp);    tic = clock();    HeapSort(fr, FN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("HeapSort:\n");    printf("\t%10d elements average running time: %f seconds\n", FN, spent);    tic = clock();    HeapSort(fr, FN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements best running time: %f seconds\n", FN, spent);    for (i = 0; i < FN; i++)        vr[i] = fr[FN - 1 - i];    tic = clock();    HeapSort(vr, FN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements worst running time: %f seconds\n", FN, spent);    tic = clock();    HeapSort(sfr, SN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements average running time: %f seconds\n", SN, spent);    tic = clock();    HeapSort(sfr, SN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements best running time: %f seconds\n", SN, spent);    for (i = 0; i < SN; i++)        svr[i] = sfr[SN - 1 - i];    tic = clock();    HeapSort(svr, SN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements worst running time: %f seconds\n", SN, spent);    return 0;}void HeapSort(int a[], int len){    int i, temp, si;    si = len;    BuildMaxHeap(a, len);    for (i = len - 1; i > 0; i--) {        temp = a[i];        a[i] = a[0];        a[0] = temp;        si = si - 1;        MaxHeap(a, 0, si);    }}void BuildMaxHeap(int a[], int len){    int i, si, mid;    si = len;    mid = len / 2 - 1;    for (i = mid; i>=0; i--)        MaxHeap(a, i, si);}void MaxHeap(int a[], int i, int si){    int lef, rig, largest, temp;    lef = 2 * i + 1;    rig = 2 * i + 2;    if (lef < si && a[lef] > a[i])        largest = lef;    else        largest = i;    if (rig < si && a[rig] > a[largest])        largest = rig;    if (largest != i) {        temp = a[i];        a[i] = a[largest];        a[largest] = temp;        MaxHeap(a, largest, si);    }}


8.计数排序(count sort)

#include <stdio.h>#include <stdlib.h>#include <time.h>#define FN 10000#define SN 30000#define NELEMS(x) (sizeof(x) / sizeof(x[0]))void CountSort(int [], int [], int, int);int maximum(int [], int);main(){    int c, i, len, ran,        fr[FN], vr[FN], ofr[FN],        sfr[SN], svr[SN], osr[SN];    double spent;    FILE *fifp, *sifp, *fofp, *sofp;    clock_t tic, toc;    i = 0;    fifp = fopen("FNRandomNum.txt", "r");    fscanf(fifp, "%d", &c);    while (!feof(fifp)) {        fr[i++] = c;        fscanf(fifp, "%d", &c);    }    fr[i] = c;    fclose(fifp);    i = 0;    sifp = fopen("TNRandomNum.txt", "r");    fscanf(sifp, "%d", &c);    while (!feof(sifp)) {        sfr[i++] = c;        fscanf(sifp, "%d", &c);    }    sfr[i] = c;    fclose(sifp);    tic = clock();    CountSort(fr, ofr, FN, maximum(fr, FN));    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("CountSort:\n");    printf("\t%10d elements average running time: %f seconds\n", FN, spent);    tic = clock();    CountSort(ofr, fr, FN, maximum(ofr, FN));    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements best running time: %f seconds\n", FN, spent);    for (i = 0; i < FN; i++)        vr[i] = fr[FN - 1 - i];    tic = clock();    CountSort(vr, ofr, FN, maximum(vr, FN));    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements worst running time: %f seconds\n", FN, spent);    tic = clock();    CountSort(sfr, osr, SN, maximum(sfr, SN));    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements average running time: %f seconds\n", SN, spent);    tic = clock();    CountSort(osr, sfr, SN, maximum(ofr, SN));    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements best running time: %f seconds\n", SN, spent);    for (i = 0; i < SN; i++)        svr[i] = sfr[SN - 1 - i];    tic = clock();    CountSort(svr, osr, SN, maximum(svr, SN));    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements worst running time: %f seconds\n", SN, spent);    return 0;}void CountSort(int a[], int b[], int len, int ran){    int i, j, k, m;    int c[ran+1];    for (i = 0; i <= ran; i++)        c[i] = 0;    for (j = 0; j < len; j++)        c[a[j]]++;    for (k = 1; k <= ran; k++)        c[k] += c[k-1];    for (m = len - 1; m >= 0; m--) {        b[c[a[m]]-1] = a[m];        c[a[m]]--;    }}int maximum(int a[], int len){    int i, maxval;    maxval = a[0];    for (i = 1; i < len; i++)        if (maxval < a[i])            maxval = a[i];    return maxval;}


9.基数排序(radix sort)

#include <stdio.h>#include <stdlib.h>#include <time.h>#define FN 10000#define SN 30000#define NELEMS(x) (sizeof(x) / sizeof(x[0]))void RadixSort(int [], int [], int, int);void CountSort(int [], int [], int [], int[], int, int);main(){    int c, i, len, sd, fd,        fr[FN], vr[FN], ofr[FN],        sfr[SN], svr[SN], osr[SN];    double spent;    FILE *fifp, *sifp, *fofp, *sofp;    clock_t tic, toc;    i = 0;    sd = fd = 5;    fifp = fopen("FNRandomNum.txt", "r");    fscanf(fifp, "%d", &c);    while (!feof(fifp)) {        fr[i++] = c;        fscanf(fifp, "%d", &c);    }    fr[i] = c;    fclose(fifp);    i = 0;    sifp = fopen("TNRandomNum.txt", "r");    fscanf(sifp, "%d", &c);    while (!feof(sifp)) {        sfr[i++] = c;        fscanf(sifp, "%d", &c);    }    sfr[i] = c;    fclose(sifp);    tic = clock();    RadixSort(fr, ofr, FN, fd);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("RadixSort:\n");    printf("\t%10d elements average running time: %f seconds\n", FN, spent);    tic = clock();    RadixSort(ofr, fr, FN, fd);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements best running time: %f seconds\n", FN, spent);    for (i = 0; i < FN; i++)        vr[i] = fr[FN - 1 - i];    tic = clock();    RadixSort(vr, ofr, FN, fd);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements worst running time: %f seconds\n", FN, spent);    tic = clock();    RadixSort(sfr, osr, SN, sd);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements average running time: %f seconds\n", SN, spent);    tic = clock();    RadixSort(osr, sfr, SN, sd);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements best running time: %f seconds\n", SN, spent);    for (i = 0; i < SN; i++)        svr[i] = sfr[SN - 1 - i];    tic = clock();    RadixSort(svr, osr, SN, sd);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements worst running time: %f seconds\n", SN, spent);    return 0;}void RadixSort(int a[], int temp[], int len, int d){    int i, j, k, m, ran;    int bb[len], c[len];    ran = 9;    for (i = 0; i < len; i++)            bb[i] = a[i];    for (j = 0; j < d; j++) {        for (k = 0; k < len; k++) {            c[k] = bb[k] % 10;            bb[k] = bb[k] / 10;        }        CountSort(a, c, temp, bb, len, ran);        for (m = 0; m < len; m++)            a[m] = temp[m];    }}void CountSort(int a[], int b[], int temp[], int bb[], int len, int ran){    int i, j, k, m, n;    int c[ran+1], te[len];    for (i = 0; i <= ran; i++)        c[i] = 0;    for (j = 0; j < len; j++)        c[b[j]]++;    for (k = 1; k <= ran; k++)        c[k] += c[k-1];    for (m = len - 1; m >= 0; m--) {        temp[c[b[m]]-1] = a[m];        te[c[b[m]]-1] = bb[m];        c[b[m]]--;    }    for (n = 0; n < len; n++)        bb[n] = te[n];}


10.桶排序(bucket sort)

#include <stdio.h>#include <stdlib.h>#include <time.h>#define FN 10000#define SN 30000#define NELEMS(x) (sizeof(x) / sizeof(x[0]))typedef struct node *link;struct node{    int item;    link next;};void BucketSort(int [], int);main(){    int c, i, len, fr[FN], vr[FN],                   sfr[SN], svr[SN];    double spent;    FILE *fifp, *sifp, *fofp, *sofp;    clock_t tic, toc;    i = 0;    fifp = fopen("FNRandomNum.txt", "r");    fscanf(fifp, "%d", &c);    while (!feof(fifp)) {        fr[i++] = c;        fscanf(fifp, "%d", &c);    }    fr[i] = c;    fclose(fifp);    i = 0;    sifp = fopen("TNRandomNum.txt", "r");    fscanf(sifp, "%d", &c);    while (!feof(sifp)) {        sfr[i++] = c;        fscanf(sifp, "%d", &c);    }    sfr[i] = c;    fclose(sifp);    tic = clock();    BucketSort(fr, FN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("BucketSort:\n");    printf("\t%10d elements average running time: %f seconds\n", FN, spent);    tic = clock();    BucketSort(fr, FN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements best running time: %f seconds\n", FN, spent);    for (i = 0; i < FN; i++)        vr[i] = fr[FN - 1 - i];    tic = clock();    BucketSort(vr, FN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements worst running time: %f seconds\n", FN, spent);    tic = clock();    BucketSort(sfr, SN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements average running time: %f seconds\n", SN, spent);    tic = clock();    BucketSort(sfr, SN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements best running time: %f seconds\n", SN, spent);    for (i = 0; i < SN; i++)        svr[i] = sfr[SN - 1 - i];    tic = clock();    BucketSort(svr, SN);    toc = clock();    spent = (double)(toc - tic) / CLOCKS_PER_SEC;    printf("\t%10d elements worst running time: %f seconds\n", SN, spent);    return 0;}link nextSort(link);int maximum(int [], int);void BucketSort(int a[], int len){    int i, j, pos, maxval;    link buc[len], curr, nlist;    maxval = maximum(a, len);    for (i = 0; i < len; i++)        buc[i] = NULL;    for (i = 0; i < len; i++) {        pos = (int)(a[i] * len / maxval);        curr = (link)malloc(sizeof(*curr));        curr->next = buc[pos];        curr->item = a[i];        buc[pos] = curr;    }    for (i = 0, j = 0; i < len; i++) {        buc[i] = nextSort(buc[i]);        nlist = buc[i];        while(nlist) {            a[j++] = nlist->item;            nlist = nlist->next;        }    }    for (i = 0; i < len; i++) {        link hd;        hd = buc[i];        while (hd) {            link nt;            nt = hd;            hd = hd->next;            free(nt);        }    }    free(buc);}link nextSort(link lis){    struct node head;    link slis, b, p, tmp;    if (lis == NULL || lis->next == NULL)        return lis;    slis = &head;    slis->next = NULL;    for (p = lis; p != NULL; p = tmp) {        tmp = p->next;        for (b = slis; b->next != NULL; b = b->next)            if (b->next->item > p->item)                break;        p->next = b->next;        b->next = p;    }    return slis->next;}int maximum(int a[], int len){    int i, maxval;    maxval = a[0];    for (i = 1; i < len; i++)        if (maxval < a[i])            maxval = a[i];    return maxval;}


0 0