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;
    }
    


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

  • 相关阅读:
    oracle的安装与plsql的环境配置
    Working with MSDTC
    soapui-java.lang.Exception Failed to load url
    Oracle 一个owner访问另一个owner的table,不加owner
    Call API relation to TLS 1.2
    Call API HTTP header Authorization: Basic
    VS2008 .csproj cannot be opened.The project type is not supported by this installat
    The changes couldn't be completed.Please reboot your computer and try again.
    Create DB Table View Procedure
    DB Change
  • 原文地址:https://www.cnblogs.com/Tobyuyu/p/4965439.html
Copyright © 2011-2022 走看看