1. 程式人生 > >資料結構之程式效能檢測(一):三種排序演算法·對比

資料結構之程式效能檢測(一):三種排序演算法·對比

先上程式碼:

#include<stdio.h>
#include<time.h>
# define MAX_SIZE 1001
void sort(int *a, int n);
void sort2(int *a, int n);
void sort3(int *a, int n);
void main()
{
    int n, i, step = 10;
    int a[MAX_SIZE];
    double duration;
    clock_t start;
    long repetitions;
    printf("    n                time  \n"
); for (n = 0; n <= 1000; n += step) { repetitions = 0;/*定義重複次數,便於排序耗時的計算,因為一次的話,時間太短 ,所以重複幾次求平均.*/ start = clock();/*呼叫系統時間,開始計時*/ do { repetitions ++; for (i = 0; i < n; i++) a[i] = n - i; sort3(a, n); } while
(clock()-start<1000); duration = ((double)(clock() - start)) / CLOCKS_PER_SEC;/*取差 除以CLOCKS_PER_SEC 是得時間的秒數*/ duration /= repetitions; printf("%6d %9d %f\n", n, repetitions, duration); if (n == 100) step = 100; } fflush(stdin); getchar(); } void sort(int *a,int
n)/*選擇排序*/ { int i, j, temp, t; for (i = 0; i < n - 1; i++) { temp = a[i]; t = i; for (j = i; j < n; j++) { if (a[j]>temp) { temp = a[j]; t = j; } } temp = a[t]; a[t] = a[i]; a[i] = temp; } } void sort2(int *a,int n)/*插入排序*/ { int temp, f, b, i; for (b = 1; b < n; b++) { f = b - 1; temp = a[b]; while (a[f]>temp&&f >= 0) { a[b] = a[f]; f--; b--; } a[f + 1] = temp; } } void sort3(int *a,int n)/*氣泡排序*/ { int i, j, temp; for (i = 0; i < n - 1; i++) { for (j = 0; j < n - i - 1; j++) { if (a[j] > a[j + 1]) { temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } } }

OK 那嗎! 如上,這是一個程式效能檢測程式,當然,其是針對某些特殊情況,應其特殊性,所以就沒有了普遍性! 其所針對的特殊情況為,其陣列全部為倒排列,要將其排序為升序。 如此那麼,其並不代表程式的整體效能。
下面送上測試結果:
下面是選擇排序的結果
下面是插入排序的結果
氣泡排序哈
那麼,綜上,不知是否可以得出當預測到逆序數比較多是,讀者可以優先考慮一下選擇排序呢?(依情況)