之前介紹過常見的排序演算法,可以檢視
這裡之前實現的**都是針對int型的演算法,現在我將**改寫成了模板,這樣可以應用於常見的一些型別。
為了測試比較不同的排序演算法,採用了兩種計時方式。注意,
下面的兩段**中,void(*_sort)(t*,int) 是函式指標陣列。
1. 採用clock函式,統計排序演算法所使用的時鐘數
**如下:
template
void clock_test()
;int len=sizeof(_sort)/sizeof(_sort[0]);
clock_t start,finish;
//cout<
cout<
鐩存帴鎻掑靉\t鎶樺崐鎻掑靉\t寧屽皵鎺掑簭\t
"for(int k=100;k<=100000;k+=step)
cout
\t';
for(int i=0;i'
\t';
cout部分測試輸出如下:
2. 利用ftime函式,具體介紹見這兒
**如下:
template
void time_test()
;int len=sizeof(_sort)/sizeof(_sort[0]);
struct timeb ts1,ts2;
time_t t_sec,t_ms,ti;
cout<
鐩存帴鎻掑靉\t鎶樺崐鎻掑靉\t寧屽皵鎺掑簭\t
"for(int k=100;k<=100000;k+=step)
cout部分測試輸出如下:
最終的全部**如下:
view code
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define timeb timeb
#define _func cout<<__function__>
cout
namespace std;
const
char *const red = "
\033[0;40;31m
";const
char *const green= "
\033[0;40;32m
";const
char *const normal = "
\033[0m
";template
void insert_sort(t a,int n)
a[j+1]=t;}}
template
void binary_insert_sort(t a,int n)
for(int j=i;j>mid;j--)
a[j]=a[j-1];
a[low]=t;}}
template
void shell_sort(t a,int n)
if(gap>1)
gap/=2;}}
template
void shell_sort2(t a,int n)
gap/=2;}}
template
void select_sort(t a,int n)
}template
void select_sort3(t a,int n)
}template
void adjust(t b,int m,int n)
}template
void heap_sort(t a,int n)
}template
void bubble_sort(t a,int n)
template
void bubble_sort2(t a,int n)
}template
void qsort(t a,int l,int r)
}if(j>l)
qsort(a,l,j);
if(iclass t>
void quick_sort(t a,int n)
template
void merge(t a,t b,int l,int m,int r)
while(i<=m)
b[k++]=a[i++];
while(j<=r)
b[k++]=a[j++];
for(int s=l;s<=r;s++)
a[s]=b[s];
}template
void msort(t a,t b,int l,int r)
}template
void merge_sort(t a,int n)
template
void merge_pass(t x,t y,int s,int n)
if(i+s1,n-1);
else
for(int j=i;j<=n-1;j++)
y[j]=x[j];
}template
void merge_sort2(t a,int n)
st.push_back(n-1);
t *b=new t[n];
int l,m,r;
l=0;
if(!st.empty())
while(!st.empty())
delete b;
}template
void merge_sort4(t a,int n)
pos[k++]=n-1;
t *b=new t[n];
int l,m,r;
l=0;
int p=0;
if(pwhile(pclass t>
void rank(t arr,int n,int r)}}
template
void rank_sort(t arr,int n)
}delete r;
}template
void rank_sort2(t a,int n)
if(dreturn d;
}void radix_sort(int a,int n)
for(int i=1;i<10;i++)
count[i]+=count[i-1];
for(int i=n-1;i>=0;i--)
for(int i=0;i10;
}delete temp;
delete count;
}void radix_sort2(int a,int n)
vectorint> >::iterator ite2;
y.clear();
for(ite2=bin.begin();ite2!=bin.end();++ite2)
x=y;
adix*=10;
}int i=0;
for(ite=x.begin();ite!=x.end();ite++)
a[i++]=*ite;
}template
void sort_test(void (*_sort)(t*,int))
}template
void clock_test()
;int len=sizeof(_sort)/sizeof(_sort[0]);
clock_t start,finish;
//cout<
cout<
鐩存帴鎻掑靉\t鎶樺崐鎻掑靉\t寧屽皵鎺掑簭\t
"for(int k=100;k<=100000;k+=step)
cout
\t';
for(int i=0;i'
\t';
cout
void time_test()
;int len=sizeof(_sort)/sizeof(_sort[0]);
struct timeb ts1,ts2;
time_t t_sec,t_ms,ti;
cout<
鐩存帴鎻掑靉\t鎶樺崐鎻掑靉\t寧屽皵鎺掑簭\t
"for(int k=100;k<=100000;k+=step)
cout
演算法基礎篇 線性時間非比較排序演算法
注 關於非線性時間得比較排序演算法請看我得另一篇部落格 主要思想 獲取待排序陣列得最大值和最小值,然後開闢乙個從最小值到最大值得連續的陣列,該陣列陣列頭是最小值,陣列尾是最大值。根據陣列中數字相對於最小值最大值的大小儲存在相應得位置。所以該演算法適合進行整數得排序,有理數排序不太適用。def cou...
排序演算法比較
本章中已經研究並仔細分析了多個內部排序方法。對於這些內部排序方法之間的比較,主要從以下幾個方面綜合考慮 時間複雜度 空間複雜度 演算法穩定性 演算法簡單性 待排序記錄數 n的大小 記錄本身的資訊量等。選擇n 個整數組成一些隨機排序,各種內部排序方法的實際時間如圖 7 10 所示。從時間複雜度看,所有...
排序演算法比較
排序方法 最好時間 平均時間 最壞時間 輔助儲存 穩定性備註 簡單選擇排序 o n2 o n2 o n2 o 1 不穩定n小時較好 直接插入排序 o n o n2 o n2 o 1 穩定大部分已有序時較好 氣泡排序 o n o n2 o n2 o 1 穩定n小時較好 希爾排序 o n o nlogn...