实验目的: 比较各排序算法
实验环境: Vista + VS 2005 .net 使用语言:
C++
设计的基本思路:
首先将各个排序算法写成函数,函数所需要接收的参数是数
组的长度 Length,将 Length 定义在 main 函数外边并申明为 const。
利用系统时间 time(0)作为随机数的种子,保证随机数的唯一性,
生成的随机数保存在 pdata[Length]中,将 pdata[Length]中的随机
数复制成 5 个副本,放置于 copy[5][Length]的二维数组里,每个
副本对应一个排序算法,以保证在同一次程序的运行中各排序算
法的对象是相同的随机数组。利用 time 类的 clock( ) 函数获得系
统时间,用来计算出每个排序算法执行排序所需要的时间,以
ms 为单位,然后在命令控制台输出各排序排列同一个随机数组
所需要的时间,用来比较各个算法。
程序清单:
#include
#include
#include
#include
using namespace std;
void Merge(int* data, int p, int q, int r);
void MergeSort(int* data, int p, int r);
void BubbleSort(int* data, int Count);
void SelectSort(int* data, int Count);
void Run(int* data, int left, int right);
void QuickSort(int* data, int Count);
void InsertSort(int* data, int Count);
void CRandom(int* data, int l);
void CountMergeSort(int* data);
void CountBubbleSort(int* data);
void CountSelectSort(int* data);
void CountQuickSort(int* data);
void CountInsertSort(int* data);
const long Length = 10000;
//定义随机数组长度
clock_t start,finish;
//设置起始时间和完结时间变量
double total_time;
//计算各排序函数运行时间的变量
int main()
{
int *pdata = new int[Length];
int * copy[5];
//新建二维数组用来保存随机数组副本
copy[0] = new int[Length];
copy[1] = new int[Length];
copy[2] = new int[Length];
copy[3] = new int[Length];
copy[4] = new int[Length];
CRandom(pdata, Length);
//产生Length大小的随机数列,保存到pdata[]中
for (int j=0; j<5; j++)
{
}
for(int k=0; k
//MergeSort START
void Merge(int *data, int p, int q, int r)
{
int i, j, k, n1, n2;
n1 = q - p + 1;
n2 = r - q;
int *L = new int[n1];
int *R = new int[n2];
for(i = 0, k = p; i < n1; i++, k++)
{
}
L[i] = data[k];
for(i = 0, k = q + 1; i < n2; i++, k++)
{
}
R[i] = data[k];
for(k = p, i = 0, j = 0; i < n1 && j < n2; k++)
{
if(L[i] > R[j])
{
}
else
{
}
data[k] = L[i];
i++;
data[k] = R[j];
j++;
}
if(i < n1)
{
}
for(j = i; j < n1; j++, k++)
{
}
data[k] = L[j];
if(j < n2)
for(i = j; i < n2; i++, k++)
{
}
data[k] = R[i];
{
}
}
void MergeSort(int *data, int p, int r)
{
}
if(p < r)
{
}
int q = (p + r) / 2;
MergeSort(data, p, q);
MergeSort(data, q + 1, r);
Merge(data, p, q, r);
//MergeSort END
//BubbleSort START
void BubbleSort(int* data,int Count)
{
int iTemp;
for(int i=0;i
if(data[j]middle) && (j>left))//从右扫描大于中值的数
j--;
if(i<=j)//找到了一对值
{
//交换
iTemp = data[i];
data[i] = data[j];
data[j] = iTemp;
i++;
j--;
}
}while(i<=j);//如果两边扫描的下标交错,就停止(完成一次)
//当左边部分有值(lefti),递归右半边
if(right>i)
Run(data,i,right);
void QuickSort(int* data,int Count)
{
}
Run(data,0,Count-1);
//QuickSort END
//Insert START
void InsertSort(int* data,int Count)
{
int temp;
for(int i=1;i
0&&tempms 为单位(下同)
}
void CountBubbleSort(int* data)
{
}
start = clock();
BubbleSort(data, Length);
finish = clock();
total_time = (double)(finish-start)/CLOCKS_PER_SEC;
cout << "BubbleSort costs " << total_time * 1000 <<" ms." << endl;
void CountSelectSort(int* data)
{
}
start = clock();
SelectSort(data, Length);
finish = clock();
total_time = (double)(finish-start)/CLOCKS_PER_SEC;
cout << "SelectSort costs " << total_time * 1000 <<" ms." << endl;
void CountQuickSort(int* data)
{
}
start = clock();
QuickSort(data, Length);
finish = clock();
total_time = (double)(finish-start)/CLOCKS_PER_SEC;
cout << "QuickSort costs " << total_time * 1000 <<" ms." << endl;
void CountInsertSort(int* data)
{
}
start = clock();
InsertSort(data, Length);
finish = clock();
total_time = (double)(finish-start)/CLOCKS_PER_SEC;
cout << "InsertSort costs " << total_time * 1000 <<" ms." << endl;
实验结果:
1. 当 Length 为 1000 时:
可见在数组长度比较小的情况下,在我的 PC 上,各个算法的执行没有可以观察到的差别。
执行了 5 次才出现一次冒泡排序不是 0 ms .
2. 当 Length 为 10000 时:
在数组长度为 10000 时,冒泡排序已经体现出速率上的略势,快速排序和归并排序表现出的
执行速率比较高。
3. 当 Length 为 100000 时:
当数组大小达到 100000 的时候,冒泡排序明显力不从心,从时间的方面来说,快速排序的
表现最好,其次是归并排序,然后是插入排序,接着是选择排序,冒泡最低效。