算法分析与设计实验 分治策略 两路合并排序和快速排序
来源:互联网 发布:双色球246红球计算法 编辑:程序博客网 时间:2024/06/06 02:18
实验目的
理解分治法的算法思想,阅读实现书上已有的部分程序代码并完善程序, 加深对分治法
的算法原理及实现过程的理解。
实验内容
用分治法实现一组无序序列的两路合并排序和快速排序。要求清楚合并排序及快速排序
的基本原理, 编程实现分别用这两种方法将输入的一组无序序列排序为有序序列后输出。
理解分治法的算法思想,阅读实现书上已有的部分程序代码并完善程序, 加深对分治法
的算法原理及实现过程的理解。
实验内容
用分治法实现一组无序序列的两路合并排序和快速排序。要求清楚合并排序及快速排序
的基本原理, 编程实现分别用这两种方法将输入的一组无序序列排序为有序序列后输出。
实验代码:
//分治法实现两路合并排序和快速排序//包含所需各种头文件 #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赋值100sortablelist.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;}
0 0
- 算法分析与设计实验 分治策略 两路合并排序和快速排序
- 基于分治策略的排序算法:合并排序和快速排序
- 算法(分治)合并排序和快速排序
- 归并排序和快速排序比较【算法设计与分析实验报告】
- 合并排序/归并排序(递归与分治)-算法设计与分析
- 【快速排序、合并排序与分治思想】
- 算法中分治策略实现合并排序
- 算法分析与设计实验一 分治策略
- 南邮算法分析与设计实验1 分治策略
- 递归与分治策略-----合并排序
- Java语言描述:递归与分治策略之合并排序与快速排序
- 算法中分治策略实现快速排序
- 分治策略----快速排序
- 【算法设计与分析】4、合并排序
- 递归与分治策略之快速排序
- 递归与分治策略之快速排序
- 递归与分治策略-2.8快速排序
- 分治算法-合并排序
- 【LeetCode】172.Factorial Trailing Zeroes
- Shell 脚本预定义的特殊变量解析
- PHP如何关闭notice级别的错误提示
- poj 1050 To the Max (从O(N^6)到O(N^3))
- 五子棋(一)
- 算法分析与设计实验 分治策略 两路合并排序和快速排序
- UDP通信之单播、广播和多播
- Hessian学习总结(一)
- A*算法求最短路径 java 源码(拿来即可用)
- 习题3—36
- 抽象工厂模式
- linux WOL远程唤醒
- Hibernate4实战 之 第一部分 Hibernate入门
- uva11481 Arrange the Numbers(错位排列)