資料結構實訓五——排序演算法應用
阿新 • • 發佈:2020-12-15
- 實驗目的:
(1)熟練掌握常用的內排序方法並加以比較。 - 實驗內容:
利用隨機函式產生N個隨機整數(20000以上),對這些數進行多種方法進行排序。要求:
(1)至少採用三種方法實現上述問題求解(提示,可採用的方法有希爾排序、起泡排序、快速排序、選擇排序、堆排序)。並把排序後的結果儲存在不同的檔案中。
(2)統計每一種排序方法的效能(以上機執行程式所花費的時間為準進行對比),找出其中兩種較快的方法。
3.實驗程式碼:
#include<bits/stdc++.h>
using namespace std;
const int maxn=20000+100 ;
int a[maxn],n,b[maxn];
void sortloop(int n,int *b)
{
for(int i=1; i<n; i++)
{
for(int j=i+1; j<=n; j++)
if(b[i]>b[j]) swap(b[i],b[j]);
}
}
void sortquick(int l,int r,int *b)
{
if(l<r)
{
int val=b[l];
int low=l,high=r;
while (low<high)
{
while(b[high]>=val&&low<high) high--;
b[low]=b[high];
while(b[low]<=val&&low<high) low++;
b[high]=b[low];
}
a[low]=val;
sortquick(l,low-1,b);
sortquick(low+1,r,b);
}
}
void sortshell(int n,int *b){
/*for(int gap=2*n;gap;gap=gap/2){
for(int i=gap;i<=n;i++){
for(int j=i-gap;j>=1;j-=gap){
if(b[j]>b[j+gap]) swap(b[j],b[j+gap]);///不優化
}
}
}*/
for(int gap=2*n;gap;gap=gap/2){
for(int i=1;i<=gap;i++){///gap組
for(int j=i+gap;j<=n;j+=gap){
if(b[j]<b[j-gap]){
int tmp=b[j],q=j-gap;
while(q>=1&&b[q]>tmp){
b[q+gap]=b[q];q-=gap;
}
b[q+gap]=tmp;
}
}
}
}
}
int main()
{
srand(time(0));//隨機數種子
clock_t s,e;
n=(rand()*rand()+rand())%20000+1;///隨機生成陣列的長度
for(int i=1; i<=n; i++)
{
a[i]=(rand()*rand()+rand())%10000+1;///隨機生成陣列內的元素
b[i]=a[i];///拷貝
}
cout<<"原陣列的元素為:"<<endl;
/*for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
if(i%5==0) puts("");
}*/
///選擇排序 希爾排序 堆排序
s=clock();///計算程式碼執行時間
cout<<"氣泡排序後的元素為"<<endl;
sortloop(n,b);
/*for(int i=1;i<=n;i++){
cout<<b[i]<<" ";
if(i%5==0) puts("");
}*/
e=clock();
cout<<"氣泡排序花費的時間為:"<<(double(e-s)/CLOCKS_PER_SEC)<<"s\n";
s=clock();///計算程式碼執行時間
cout<<"快速排序後的元素為"<<endl;
for(int i=1; i<=n; i++) b[i]=a[i];
sortquick(1,n,b);
/*for(int i=1;i<=n;i++){
cout<<b[i]<<" ";
if(i%5==0) puts("");
}*/
e=clock();
cout<<"快速排序花費的時間為:"<<(double(e-s)/CLOCKS_PER_SEC)<<"s\n";
s=clock();///計算程式碼執行時間
cout<<"希爾排序後的元素為"<<endl;
for(int i=1; i<=n; i++) b[i]=a[i];
sortshell(n,b);
/*for(int i=1;i<=n;i++){
cout<<b[i]<<" ";
if(i%5==0) puts("");
}*/
e=clock();
cout<<"希爾排序花費的時間為:"<<(double(e-s)/CLOCKS_PER_SEC)<<"s\n";
return 0;
}