经典排序算法实验复杂性分析
来源:互联网 发布: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;}
#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;}
- 经典排序算法实验复杂性分析
- 合并排序算法的时间复杂性分析
- 插入排序、归并排序和递归算法的复杂性分析
- 插入排序、归并排序和递归算法的复杂性分析
- 排序算法复杂性
- 算法复杂性分析
- 算法复杂性分析
- 查找和排序算法简介及复杂性分析
- 经典排序算法分析
- 排序稳定性及复杂性分析
- 经典排序算法--归并排序算法分析
- 一些经典排序算法分析
- 冒泡排序时间复杂性的分析
- 快速排序的时间复杂性分析
- 算法设计与复杂性分析(1)
- 算法学习(一)---复杂性分析
- 算法复杂性
- 算法复杂性
- 时空上下文视觉跟踪(STC)算法的解读与代码复现
- 3月24日--3月30日(共15小时,剩4508小时)
- 为什么在密码问题上char[]优先于String?
- dx11啃不动了,要调整了
- xcode学习之帮助文档offline
- 经典排序算法实验复杂性分析
- RootKits——windows内核的安全防护
- java过滤器和监听器详解
- 整数解 2092
- 斑点检测系列Lob拉普拉斯--总结
- java基础加强_03_枚举
- 一路走来(历史篇)
- unity3D游戏开发实战原创视频讲座系列4之2D疯狂赛出手游戏开发
- 递归与递推设计 猴子爬山问题 农夫圈羊问题