一、题目描述
通过随机数据比较各排序算法的关键字比较次数和关键字移动次数,以 及执行时间,取得直观感受。
二、设计要求
一、需求分析
实现各排序算法,分别进行以下各组比较,并进行总结。
一、各算法在不同规模下的比较。
1)比较范围:直接插入排序、冒泡法排序、简单选择排序、快速排序1(自己实现)、快速排序2(调用STL)、归并排序。
2)比较指标:a)关键字操作次数(比较次数和移动次数之和),b)排序时间。每个指标采用多次重复取平均数记录,重复次数不小于100。注:1次关键字对换按3次移动计算。
3)数据规模:分别为50,100,500,1000,5000,10000;
4)数据类型:随机数据
二、算法在不同数据类型下的比较
1)比较范围:直接插入排序、冒泡法排序、简单选择排序、快速排序1(自己实现)、快速排序2(调用STL)、归并排序。
2)比较指标:a)关键字操作次数(比较次数和移动次数之和),b)排序时间。每个指标采用多次重复取平均数记录,重复次数不小于100。注:1次关键字对换按3次移动计算。
3)数据规模:10000;
4)数据类型:随机数据、正序数据、逆序数据;
三、代码要求
1、必须要有异常处理,比如删除空链表时需要抛出异常;
2、保持良好的编程的风格:
代码段与段之间要有空行和缩近
标识符名称应该与其代表的意义一致
函数名之前应该添加注释说明该函数的功能 、关键代码应说明其功能
3、递归程序注意调用的过程,防止栈溢出
四、算法分析
#include<iostream>
#include<time.h>
#include <algorithm>
#include<stdlib.h>
#include <windows.h>
#include <string>
using namespace std;
//关键次数初始化
static long long move1=0;
static long long move2=0;
static long long move3=0;
static long long move4=0;
static long long move5=0;
static long long move6=0;
//输出结果
void print(int a[], int n){
for(int j= 0; j<n; j++){
cout<<a[j] <<" ";
}
cout<<endl<<endl;
}
/***********归并排序*******************/
void Merge(int r[],int rf[], int i, int m, int n) //归并操作
{
int j,k;
for(j=m+1,k=i; i<=m && j <=n ; ++k){
move1+=1;
if(r[i] < r[j]) {rf[k] = r[i++]; move1+=3; move1+=1;}
else {rf[k] = r[j++]; move1+=3; move1+=1;}
}
while(i <= m) {rf[k++] = r[i++]; move1+=3; move1+=2;}
move1+=1;
while(j <= n) {rf[k++] = r[j++]; move1+=3; move1+=2;}
move1+=1;
}
void MSort(int r[], int rf[], int s, int t) //将r[]归并排序为rf[]
{
move1+=1;
//int *rf2=new int[t];
int rf2[10000+1];
if(s==t) {rf[s] = r[s]; move1+=3;}
else
{
move1+=1;
int m=(s+t)/2; /*平分*p 表*/
MSort(r, rf2, s, m); /*递归地将p[s…m]归并为有序的p2[s…m]*/
MSort(r, rf2, m+1, t); /*递归地将p[m+1…t]归并为有序的p2[m+1…t]*/
Merge(rf2, rf, s, m,t); /*将p2[s…m]和p2[m+1…t]归并到p1[s…t]*/
}
}
void MergeSort(int r[], int rf[], int n)
{ /*对顺序表*p 作归并排序*/
MSort(r, rf, 0, n-1);
}
/*************归并排序结束*******************/
/***********快速排序1(递归)*******************/
/*
void swap(int* a,int*b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
move2+=3;
}
int Partition(int a[],int low,int high)
{
int pivotkey= a[low];
while(low<high)
{
while (low<high&&a[hig