資料結構之程式效能檢測(一):三種排序演算法·對比
阿新 • • 發佈:2019-02-06
先上程式碼:
#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 那嗎! 如上,這是一個程式效能檢測程式,當然,其是針對某些特殊情況,應其特殊性,所以就沒有了普遍性! 其所針對的特殊情況為,其陣列全部為倒排列,要將其排序為升序。 如此那麼,其並不代表程式的整體效能。
下面送上測試結果:
那麼,綜上,不知是否可以得出當預測到逆序數比較多是,讀者可以優先考慮一下選擇排序呢?(依情況)