当前位置:文档之家› 归并排序实验报告

归并排序实验报告

篇一:归并排序与快速排序实验报告一、实验内容:对二路归并排序和快速排序对于逆序的顺序数的排序时间复杂度比较。

二、所用算法的基本思想及复杂度分析:1、归并排序1)基本思想:运用分治法,其分治策略为:①划分:将待排序列 r1,r2,……,rn划分为两个长度相等的子序列r1,……,rn/2和rn/2+1,……,rn。

②求解子问题:分别对这两个子序列进行排序,得到两个有序子序列。

③合并:将这两个有序子序列合并成一个有序子序列。

2)复杂度分析:二路归并排序的时间代价是o(nlog2n)。

二路归并排序在合并过程中需要与原始记录序列同样数量的存储空间,因此其空间复杂性o(n)。

2、快速排序:1)基本思想:运用分治法,其分治策略为:①划分:选定一个记录作为轴值,以轴值为基准将整个序列划分为两个子序列r1……ri-1和ri+1……rn,轴值的位置i在划分的过程中确定,并且前一个子序列中记录的值均小于或等于轴值,后一个子序列中记录的值均大于或等于轴值。

②求解子问题:分别对划分后的每一个子序列递归处理。

③合并:由于对子序列r1……ri-1和ri+1……rn的排序是就地进行的,所以合并不需要执行任何操作。

2)复杂度分析:快速排序在平均时间复杂性是o(nlog2n)。

最坏的情况下是o(n^2)。

三、源程序及注释:1、归并排序#include<iostream>#include<fstream>#include windows.husing namespace std;void merge(int r[],int r1[],int s,int m,int t )}int mergesort(int r[],int r1[],int s,int t){}void main()int i=s; int j=m+1; int k=s; while(i<=m&&j<=t) {} if(i<=m)while(i<=m) r1[k++]=r[i++];//第一个没处理完,进行收尾if(r[i]<=r[j])r1[k++]=r[i++];//取r[i]和r[j]中较小的放入r1[k]中else r1[k++]=r[j++]; else while(j<=t) r1[k++]=r[j++];//第二个没处理完,进行收尾for(int l=0;l<k;l++) { } r[l]=r1[l];//将合并完成后的r1[]序列送回r[]中if(s==t)r1[s]=r[s]; else{int m; m=(s+t)/2; mergesort(r,r1,s,m);//归并排序前半个子序列 mergesort(r,r1,m+1,t); //归并排序后半个子序列 merge(r1,r,s,m,t);//合并两个已排序的子序列 }return 0;int a[100000]; int a1[10000];int n,i;int b[3]= {1000,3000,5000};//产生3个数组。

for(int j=0; j<3; j++){n=b[j];for(i=1; i<=n; i++)a[i]=n;large_integer begaintime ;large_integer endtime ;large_integer frequency;queryperformancefrequency(&frequency);queryperformancecounter(&amp ;begaintime) ;int c=mergesort(a,a1,0,n-1); queryperformancecounter(&endtime); cout << 数据个数为<<n<<时归并排序的时间为(单位:s):<<(double)( endtime1.quadpart - begaintime1.quadpart )/ frequency1.quadpart <<endl;}}2、快速排序#include<iostream>#include<fstream>#include windows.husing namespace std;int partition (int data[],int first,int end){int i,j;} while(i<j) { } return i; while(i<j&&data[i]<=data[j])j--;//从左侧扫描 if(i<j) {} while(i<j&&data[i]<=data[j])i++;//从右侧扫描if(i<j) {} int temp1; temp1=data[i]; data[i]=data[j]; data[j]=temp1; //将较小的放到后面 j--; int temp; temp=data[i]; data[i]=data[j]; data[j]=temp;//将较小的放到前面 i++;int quicksort(int c[],int first,int end){int i; if(first<end) { i=partition(c,first,end);//对c[hs]到c[ht]进行一次划分} } quicksort(c,i+1,end);//递归处理右区间 return 0;void main(){int a[100000],n,i;int b[3]= {1000,3000,5000};//3个数据范围for(int j=0; j<3; j++){n=b[j];for(i=1; i<=n; i++) a[i]=n;large_integer begaintime ;large_integer endtime;large_integer frequency ;queryperformancefrequency(&frequency);queryperformancecounter(&am p;begaintime) ;int c= quicksort(a,0,n); queryperformancecounter(&endtime);cout << 数据个数为<<n<<时快速排序的时间为(单位:s):<<(double)( endtime.quadpart - begaintime.quadpart )/ frequency.quadpart <<endl;}}四、运行输出结果:归并排序篇二:算法分析与设计实验报告-合并排序、快速排序实验报告实验一合并排序、快速排序一.实验目的(1)学习合并排序和快速排序算法的思想,掌握原理。

(2)运用合并排序和快速排序算法的思想进行编程实现,以加深理解。

二.实验内容(1)输入几个整数,运用合并排序的思想进行编程实现,输出正确的排序结果。

(2)输入10个整数,运用快速排序的思想进行编程实现,输出正确的排序结果三.实验代码(1)合并排序源代码如下:#include <iomanip.h>//调用setw#include <iostream.h> //将b[0]至b[right-left+1]拷贝到a[left]至a[right] template <class t>void copy(t a[],t b[],int left,int right){ int size=right-left+1;for(int i=0;i<size;i++){a[left++]=b[i];}} //合并有序数组a[left:i],a[i+1:right]到b,得到新的有序数组btemplate <class t>void merge(t a[],t b[],int left,int i,int right){ int a1cout=left,//指向第一个数组开头a1end=i,//指向第一个数组结尾a2cout=i+1,//指向第二个数组开头a2end=right,//指向第二个数组结尾bcout=0;//指向b中的元素for(int j=0;j<right-left+1;j++)//执行right-left+1次循环{ if(a1cout>a1end){b[bcout++]=a[a2cout++];continue; } //如果第一个数组结束,拷贝第二个数组的元素到b if(a2cout>a2end) {b[bcout++]=a[a1cout++];continue; } //如果第二个数组结束,拷贝第一个数组的元素到 b if(a[a1cout]<a[a2cout]){ b[bcout++]=a[a1cout++];continue; } //如果两个数组都没结束,比较元素大小,把较小的放入belse{ b[bcout++]=a[a2cout++];continue;} } } //对数组a[left:right]进行合并排序 template <class t>void mergesort(t a[],int left,int right){ t *b=newint[right-left+1];if(left<right){int i=(left+right)/2;//取中点mergesort(a,left,i);//左半边进行合并排序 mergesort(a,i+1,right);//右半边进行合并排序 merge(a,b,left,i,right);//左右合并到b中copy(a,b,left,right);//从b拷贝回来}}int main(){ int n;cout<<请输入您将要排序的数目:; cin>>n; int *a=new int[n]; cout<<请输入相应的数字:;for(int i=0;i<n;i++){ cin>>a[i]; }mergesort( a, 0, n-1); cout<<排序结果:;for(int j=0;j<n;j++){ cout<<setw(5)<<a[j]; }cout<<endl;return 1;}(2)快速排序源代码如下:#include <iostream.h>#define max 10int quicksort(int a[],int l,int r){int pivot; //枢轴int i=l;int j=r;int tmp;pivot=a[(l+r)/2];//取数组中间的数为枢轴 do {while (a[i]<pivot) i++; //i右移while (a[j]>pivot) j--;// j左移if (i<=j){tmp=a[i];a[i]=a[j];a[j]=tmp; //交换a[i]和a[j] i++;j--;}} while(i<=j);if (l<j) quicksort(a,l,j);if (i<r) quicksort(a,i,r);return 1;}int main(){int array[max];int i;cout<<请输入<<max<< 个整数:; for (i=0;i<max;i++)cin>>array[i];quicksort(array,0,max-1); cout<<快速排序后:<<endl; for (i=0;i<max;i++)cout<<array[i]<< ; cout<<endl;return 0;}四.实验结果五.总结与思考篇三:合并、快速排序实验报告合并、快速排序一.实验目的:1. 理解算法设计的基本步骤及各部的主要内容、基本要求;2. 加深对分治设计方法基本思想的理解,并利用其解决现实生活中的问题;3. 通过本次试验初步掌握将算法转化为计算机上机程序的方法。

相关主题