1. 程式人生 > 其它 >[實驗]遞迴與分治策略之合併排序和快速排序比較

[實驗]遞迴與分治策略之合併排序和快速排序比較

技術標籤:演算法c++演算法合併排序快速排序

一、實驗內容:

隨機產生20組資料,第一組500000個,第二組1000000個,以此類推,到第20組10000000個,資料範圍為(0,100000),對同一組資料進行合併排序和快速排序,記錄執行時間,結果如下:

二、實驗結果

1
2

接連結果均相差無幾。可以做一個數據視覺化分析(此處就不放圖了 作業剛剛提交 避免誤會)

三、實驗分析與結論

從以上分析得出排序同一組資料,當資料量較少時,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;
}