[實驗]遞迴與分治策略之合併排序和快速排序比較
阿新 • • 發佈:2020-12-18
一、實驗內容:
隨機產生20組資料,第一組500000個,第二組1000000個,以此類推,到第20組10000000個,資料範圍為(0,100000),對同一組資料進行合併排序和快速排序,記錄執行時間,結果如下:
二、實驗結果
接連結果均相差無幾。可以做一個數據視覺化分析(此處就不放圖了 作業剛剛提交 避免誤會)
三、實驗分析與結論
從以上分析得出排序同一組資料,當資料量較少時,QuickSort的執行時間比MergeSort的執行時間少,隨著資料增加,MergeSort的執行時間比QuickSort的執行時間少。
四、原始碼:
#include "stdafx.h" #include <iostream> #include <stdlib.h> #include <time.h> #include <string> using namespace std; int A[10000001];//資料陣列 int C[10000001];//複製陣列 int B[10000001];//輔助陣列 //初始化,隨機產生n個數據儲存在C陣列中 void Initialize(int n) { srand((unsigned)time(0)); for(int i = 1 ; i <= n ; i++) C[i] = rand()%100000; } //複製C陣列元素到A陣列 void CopyCtoA(int n) { for(int i = 1 ; i <= n ; i++) A[i] = C[i]; } //Merge void Merge(int A[], int low, int mid, int high) { int s = low , t = mid + 1 , k = low; //將小元素新增到輔助陣列 while( s<=mid && t<=high ) { if(A[s]<=A[t]) { B[k] = A[s]; s = s + 1; } else { B[k] = A[t]; t = t + 1; } k = k + 1; } if(s == mid + 1) { //把A[t...high]中剩餘的元素複製到B陣列 for(int i = k ; i <= high ; i++) B[i] = A[t++]; } else { //把A[s...mid]中剩餘的元素複製到B陣列 for(int i = k ; i <= high ; i++) B[i] = A[s++]; } //把B陣列複製到A陣列 for(int j = low ; j <= high ; j++) A[j] = B[j]; } //MergeSort void MergeSort(int A[], int low, int high) { if(low < high) { //把陣列分成兩部分分別排序在合併 int mid = (low+high)/2; MergeSort(A , low , mid); MergeSort(A , mid+1 , high); Merge(A , low , mid , high); } } //Split int Split(int A[],int low,int high) { A[0]=A[low]; int key=A[low]; while(low<high) { while((low<high)&&(A[high]>=key)) high--; if(low<high) A[low++]=A[high]; while((low<high)&&(A[low]<=key)) low++; if(low<high) A[high--]=A[low]; } A[low]=A[0]; return low; } //QuickSort void QuickSort(int A[], int low, int high) { int mid; if(low < high) { //把陣列劃分成兩部分 mid = Split(A, low, high); QuickSort(A, low, mid-1); QuickSort(A, mid+1, high); } } //對n個數執行合併排序或快速排序,計算輸出執行時間 void Sort_ExcutionTime(int n , string sort_type) { CopyCtoA(n); clock_t start, end; double totaltime; if(sort_type == "MergeSort") { start = clock(); MergeSort(A, 1, n); end = clock(); } else if(sort_type == "QuickSort") { start = clock(); QuickSort(A, 1, n); end = clock(); } totaltime = (double)(end-start)/CLOCKS_PER_SEC*1000; cout<<sort_type<<" running time is: "<<totaltime<<" ms"<<'\n'; } //執行程式 void Excute() { for(int i = 1 ; i <= 20 ; i++) { Initialize(500000*i); cout<<"n="<<500000*i<<'\n'; Sort_ExcutionTime(500000*i, "MergeSort"); Sort_ExcutionTime(500000*i, "QuickSort"); cout<<'\n'; } } int main() { Excute(); return 0; }