快速排序与归并排序算法及时间复杂度分析(C++)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
for(; i<n1; i++) //如果左数组有元素剩余,则将剩余元素合并到 data 数组
data[k++] = left[i];
for(; j<n2; j++) //如果右数组有元素剩余,则将剩余元素合并到 data 数组
data[k++] = right[j];
}
void mergeSort(int *data, int p, int r) {
n =700 时
n=800 时
n=900 时
n=1000 时
快速排序:(代码)
#include<iostream> #include<time.h> #include<stdlib.h> using namespace std; int count=0;//定义一个全局变量 count 作为计数器 void Qsort(int a[],int low,int high) { if(low>=high) { return; }
--last; a[first]=a[last];/*将比第一个小的移到低端*/ while(first<last&&a[first]<=key)
++first; a[last]=a[first];/*将比第一个大的移到高端*/ } a[first]=key;/*枢轴记录到位*/ Qsort(a,low,first-1); Qsort(a,first+1,high); } int main() { int n; int* a = NULL; //输入数据 cout<<"请输入数组的长度: "; cin>>n; a = (int *)malloc(sizeof(int)*(n)); cout<<"请对数组赋值: "; for(int i=0; i<n; ++i) {
}
i = j = 0;
k = p;
while(i<n1 && j<n2) //将数组元素值两两比较,并合并到 data 数组
{
if(left[i] <= right[j]){
data[k++] = left[i++];
++count;
}
else {
data[k++] = right[j++];
++count;
cin>>a[i]; } clock_t start,finish; //typedef long clock_t; double totaltime; start=clock(); ////开始统计时间 Qsort(a,0,n-1);/*这里原文第三个参数要减 1 否则内存泄露*/ for(i=0;i<n;i++) { cout<<a[i]<<" "; } system("pause"); /// finish=clock();
}
}
for(; i<n1; i++) //如果左数组有元素剩余,则将剩余元素合并到 data 数组
data[k++] = left[i];
++count;
for(; j<n2; j++) //如果右数组有元素剩余,则将剩余元素合并到 data 数组
data[k++] = right[j];
++count;
totaltime=(double)(finish-start)/CLOCKS_PER_SEC; //统计时间截止 cout<<"\n 此程序的运行时间为"<<totaltime<<"秒!"<<endl; return(0); } 操作结果截屏:
答:对 1 题中程序稍作修改:调用随机函数产生随机数,并对其进行 排序,并利用执行步数代替运行时间(大于 700): 归并排序:(代码)
#include <iostream> #include<time.h> using namespace std; int count=0; void merge(int *data, int p, int q, int r) {
int n1, n2, i, j, k; int *left=NULL, *right=NULL;
cin>>input[i]; } //处理数据 clock_t start,finish; double totaltime; start=clock(); ////开始统计时间 mergeSort(input,0,n-1); //输出结果 for(i=0; i<n; ++i)
cout<<input[i]<<" "; cout<<endl; system("pause"); /// finish=clock(); totaltime=(double)(finish-start)/CLOCKS_PER_SEC; //统计时间截止 cout<<"\n 此程序的运行时间为"<<totaltime<<"秒!"<<endl; return 0; } 操作结果截屏
mergeSort(a,0,n-1);
for(i=0; i<n; ++i){
cout<<a[i]<<" ";
if((i+1)%10==0) cout<<endl;
}
cout<<endl; cout<<count<<endl; return 0; }
统计当数组长度分别为 700,800,900,1000 时执行步数:结果分别见下 图:
}
void mergeSort(int *data, int p, int r)
{
int q;
if(p < r) //只有一个或无记录时不须排序
{
q = (int)((p+r)/2);
//将 data 数组分成两半
mergeSort(data, p, q); //递归拆分左数组
mergeSort(data, q+1, r); //递归拆分右数组
(2)快速排序算法: #include<iostream> #include<time.h> using namespace std; void Qsort(int a[],int low,int high)
{ if(low>=high) { return; } int first=low; int last=high; int key=a[first];/*用字表的第一个记录作为枢轴*/ while(first<last) { while(first<last&&a[last]>=key)
答:(1)归并排序算法
#include <iostream>
#include<time.h>
using namespace std;
void merge(int *data, int p, int q, int r) {
int n1, n2, i, j, k;
int *left=NULL, *right=NULL;
merge(data, p, q, r); //合并数组
}
}
int main()
{
int const n(500);//生成 500 个随机数,并把其赋值给数组 a
int a[n];
srand((int)time(NULL));
for(int i = 0; i < n;i++ )
a[i]=rand();
n1 = q-p+1;
n2 = r-q;
left = (int *)malloc(sizeof(int)*(n1));
right = (int *)malloc(sizeof(int)*(n2));
for(i=0; i<n1; i++) //对左数组赋值
left[i] = data[p+i];
for(j=0; j<n2; j++) //对右数组赋值
n1 = q-p+1; n2 = r-q;
left = (int *)malloc(sizeof(int)*(n1)); right = (int *)malloc(sizeof(int)*(n2)); for(i=0; i<n1; i++){ //对左数组赋值
left[i] = data[p+i]; ++count; } for(j=0; j<n2; j++) { //对右数组赋值 right[j] = data[q+1+j]; ++count;
int first=low; int last=high; int key=a[first];/*用字表的第一个记录作为枢轴*/ while(first<last) { while(first<last&&a[last]>=key)
--last; ++count; a[first]=a[last];/*将比第一个小的移到低端*/ ++count; while(first<last&&a[first]<=key) ++first; ++count; a[last]=a[first];/*将比第一个大的移到高端*/ ++count; } a[first]=key;/*枢轴记录到位*/ Qsort(a,low,first-1); Qsort(a,first+1,high); } int main() { int const n(500);//生成 500 个随机数,并把其赋值给数组 a int a[n]; srand((int)time(NULL)); for(int i = 0; i < n;i++ ) a[i]=rand(); Qsort(a,0,n-1); for(i=0;i<n;i++) { cout<<a[i]<<" "; if((i+1)%10==0) cout<<endl; } cout<<"执行步数为"<<count<<endl; return(0); } 统计结果(截图)
n=700 时 n=800 时 n=900 时
n=1000 时
结论:对所得结果绘图有
由图可知,快速排序的时间复杂度几乎就是 O(nlogn),而归 并排序时间复杂度大于 Nlog(N)。由于数字是随机生成的,所以基 本可代表一般性。
int q;
if(p < r) //只有一个或无记录时不须排序
{
q = (int)((p+r)/2);
//将 data 数组分成两半
mergeSort(data, p, q); //递归拆分左数组
mergeSort(data, q+1, r); //递归拆分右数组
merge(data, p, q, r); //合并数组
right[j] = data[q+1+j];
i = j wk.baidu.com 0;
k = p;
while(i<n1 && j<n2) //将数组元素值两两比较,并合并到 data 数组
{
if(left[i] <= right[j])
data[k++] = left[i++];
else
data[k++] = right[j++];
}
}
int main()
{
int n;
int* input = NULL; //输入数据 cout<<"请输入数组的长度: "; cin>>n; input = (int *)malloc(sizeof(int)*(n)); cout<<"请对数组赋值: "; for(int i=0; i<n; ++i) {