算法分析与设计实验 分治策略 两路合并排序和快速排序

实验目的
理解分治法的算法思想,阅读实现书上已有的部分程序代码并完善程序, 加深对分治法
的算法原理及实现过程的理解。
实验内容
用分治法实现一组无序序列的两路合并排序和快速排序。要求清楚合并排序及快速排序
的基本原理, 编程实现分别用这两种方法将输入的一组无序序列排序为有序序列后输出。


实验代码:

//分治法实现两路合并排序和快速排序
//包含所需各种头文件 
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
class SortableList
{
public:
	SortableList(int mSize)  //构造函数
	{
		maxSize=mSize;
		l=new int[maxSize];
		n=0;
	}
	~SortableList()   //析构函数
	{
		delete []l;
	}
	
    void Iuput();   //输入待排序列
    void Output();  //输出已经排序好的序列

	void MergeSort();   //合并排序
    void MergeSort(int left,int right);
    void Merge(int left,int mid,int right);

	void QuickSort();  //快速排序
    void Swap(int i,int j);    //交换下标为 i 和 j 的数组元素
    void QuickSort(int left,int right);
    int Partition(int left,int right);  //分化函数 
private:
	int *l;
	int maxSize;    
	int n;          //数组已有元素个数
};

void SortableList::MergeSort()  //Merge函数
{
	MergeSort(0,n-1);
}

void SortableList::MergeSort(int left,int right)  //两路合并排序
{
	if (left<right)
	{
        int mid=(left+right)/2;
        MergeSort(left,mid);
        MergeSort(mid+1,right);
        Merge(left,mid,right);
	}
}

void SortableList::Merge(int left,int mid,int right)   //Merge函数
{
    int *temp=new int[right-left+1];
    int i=left,j=mid+1,k=0;
    while((i<=mid)&&(j<=right))
       if (l[i]<=l[j]) temp[k++]=l[i++];
       else temp[k++]=l[j++];
	while (i<=mid)  temp[k++]=l[i++];
    while (j<=right) temp[k++]=l[j++];
       for (i=0,k=left;k<=right;) 
		   l[k++]=temp[i++];
}

void SortableList::Swap(int i,int j)  //值交换
{
    int c=l[i];
    l[i]=l[j];
    l[j]=c;
}

int SortableList::Partition(int left,int right)  //分化函数
{
    int i=left,j=right+1;
    do{
         do i++; while (l[i]<l[left]);
         do j--; while (l[j]>l[left]);
         if (i<j) Swap(i,j);
	}while (i<j);
    Swap(left,j);
    return j;
}

void SortableList::QuickSort()  //快速排序
{
    QuickSort(0,n-1);
}
void SortableList::QuickSort(int left,int right)  //快速排序
{
    if (left<right)
	{
        int j=Partition(left,right);
        QuickSort(left,j-1);
        QuickSort(j+1,right);
	}
}

//输入函数
void SortableList::Iuput()
{
	int num;
	cout<<"请输入数组元素个数:";
	cin>>num;
	n=num;
	cout<<"请输入"<<n<<"个整数:";
	int i;
	for(i=0;i<n;i++)
	{
		cin>>l[i];
	}
}

//输出函数
void SortableList::Output()
{
	int i;
	for(i=0;i<n;i++)
	{
		cout<<l[i]<<" ";
	}
	cout<<endl;
}
int main()
{
    SortableList sortablelist(100);   //自动调用构造函数初始化最大数组大小,此处mSize赋值100

	sortablelist.Iuput();  //输入待排序列
   
	getchar();
	cout<<"请做出选择(选择合并排序请输入字符'm',快速排序请选择字符'q')"<<endl;
	char c;   
	c=getchar();
	if(c=='m'){
	//合并排序
	sortablelist.MergeSort();
	cout<<"合并排序之后:";
	sortablelist.Output();
	}
    
	if(c=='q')
	{
    //快速排序
	sortablelist.QuickSort();
	cout<<"快速排序之后:";
	sortablelist.Output();
    }
    
	return 0;
}


  • 9
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值