内部排序算法比较(超详解)

一、题目描述
通过随机数据比较各排序算法的关键字比较次数和关键字移动次数,以 及执行时间,取得直观感受。
二、设计要求

一、需求分析
实现各排序算法,分别进行以下各组比较,并进行总结。
一、各算法在不同规模下的比较。
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
  • 30
    点赞
  • 205
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值