zoukankan      html  css  js  c++  java
  • 算法分析与设计实验一 分治策略

                                                实验一  分治策略

    实验目的:

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

    实验代码:

    //分治法实现两路合并排序和快速排序
    //包含所需各种头文件 
    #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;
    }


    运行截图:



    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    N95当手柄玩游戏,甩起来还可以用手势控制电脑,分享一下我们的设计经验
    这个回答真逗
    基于事件通信的轻量级MVP框架实现,附源码
    敏捷开发读书笔记
    开发Access数据库提示的"标准表达式中数据类型不匹配",DateTime类型解决办法
    解决mysql表已满的错误
    我的OO实践由GPS消息处理抽象出一通用命令处理类
    收到开Windows 7 party的资源了【无图无真相】
    一)我要做什么,Petshop 源码分析
    天津大学免费上网,IPV4及IPV6同时共享的解决方案
  • 原文地址:https://www.cnblogs.com/Tobyuyu/p/4965636.html
Copyright © 2011-2022 走看看