归并与快速排序算法对处理同等规模的数据的对比

用长分别为100、200、300、400、500、600、700、800、900、1000的10个数组的排列来统计这两种算法的时间复杂性;

快速排序程序:

#include<iostream>
using namespace std;

int circle;
static int num[11]={0,0,0,0,0,0,0,0,0,0,0};

void vector_initial(int *array,int n);
void vector_print(int *array,int n);
void fast_sort(int *array,int p,int r);
int separate_2part(int *array,int p,int r);
void count();

int main()
{
	int a[1000];
	int n;
	//cout<<"输入数的个数:";
	//cin>>n;
	for(circle=1;circle<=10;circle++)
	{
		vector_initial(a,circle);
		fast_sort(a,0,100*circle-1);
		vector_print(a,100*circle);
	}
	for(int i=1;i<=10;i++)
		cout<<i*100<<"个数据,执行步骤:"<<num[i]<<endl;
	return 0;
}

void vector_initial(int *array,int n)
{	int i=0;
	while(i<n*100)
	{
		array[i]=rand()%1000;
		i++;
	}
}
void vector_print(int *array,int n)
{
	for(int i=0;i<n;i++)
		cout<<array[i]<<" ";
	cout<<endl<<endl;
}

void fast_sort(int *array,int p,int r)
{
	int q;
	if(p<r)
	{
		q=separate_2part(array,p,r);
		fast_sort(array,p,q-1);
		fast_sort(array,q+1,r);
	}
}

int separate_2part(int *array,int p,int r)
{
	int n1,n2,x;
	n1=p;
	n2=r;
	x=array[p];
	while(1)
	{
		while(array[++n1]<x)
		{
			 count();
		}
		while(array[n2]>x)
		{
			count();
			n2--;
		}
		if(n1>=n2) break;
		swap(array[n1],array[n2]);
	}
	for(int i=p+1;i<=n2;i++)
	{
		array[i-1]=array[i];
	}
	array[n2]=x;
	return n2;
}

void count()
{
	switch(circle)
		{
		case 1:
				num[1]++;
				break;
		case 2:
				 num[2]++;
				 break;
		case 3:
				 num[3]++;
				 break;
		case 4:
				 num[4]++;
				 break;
		case 5:
				 num[5]++;
				 break;
		case 6:
				 num[6]++;
				 break;
		case 7:
				 num[7]++;
				 break;
		case 8:
				 num[8]++;
				 break;
		case 9:
				 num[9]++;
				 break;
		case 10:
				 num[10]++;
				 break;
		default:
			break;
		}

}

  归并测试:

#include<iostream>
#include<time.h>
using namespace std;
int a[1000];
int circle;
static int num[11]={0,0,0,0,0,0,0,0,0,0,0};

void vector_initial(int n);
void print_vector(int circle);
void MERGE_sort(int p,int r);
void MERGE_combine(int p,int q,int r);

int main()
{
	for(circle=1;circle<=10;circle++)
	{
		vector_initial(circle);
		MERGE_sort(0,circle*100-1);
		print_vector(circle*100);
	}
	for(int i=1;i<=10;i++)
		cout<<i*100<<"个数据,执行步骤:"<<num[i]<<endl;
	return 0;
}

void vector_initial(int n)
{
	int i=0;
	while(i<n*100)
	{
		a[i]=rand()%1000;
		i++;
	}
}
void print_vector(int n)
{
	for(int i=0;i<n;i++)
	{
		cout<<a[i]<<" ";
		//if(19==i%20)
		//	cout<<endl;
	}
	cout<<endl<<endl<<endl;
}
void MERGE_sort(int p,int r)//归并排序
{	int q;
	if(p<r)
	{
		q=(p+r)/2;
		MERGE_sort(p,q);
		MERGE_sort(q+1,r);
		MERGE_combine(p,q,r);
	}
}

void MERGE_combine(int p,int q,int r)
{
	int L[1000];
	int R[1000];
	int n1=q-p+1;
	int n2=r-q;
	for(int i=1;i<=n1;i++)
		L[i]=a[p+i-1];
	for(int j=1;j<=n2;j++)
		R[j]=a[q+j];
	L[n1+1]=100000;
	R[n2+1]=100000;
	i=1;j=1;
	for (int k=p;k<=r;k++)
	{
		switch(circle)
		{
		case 1:
				num[1]++;
				break;
		case 2:
				 num[2]++;
				 break;
		case 3:
				 num[3]++;
				 break;
		case 4:
				 num[4]++;
				 break;
		case 5:
				 num[5]++;
				 break;
		case 6:
				 num[6]++;
				 break;
		case 7:
				 num[7]++;
				 break;
		case 8:
				 num[8]++;
				 break;
		case 9:
				 num[9]++;
				 break;
		case 10:
				 num[10]++;
				 break;
		default:
			break;
		}
		if(L[i]<=R[j])
		{
			a[k]=L[i];
			i++;
		}
		else
		{
			a[k]=R[j];
			j++;
		}
	}
}

  测试结果对比:

归并算法

快速排序算法:

时间: 2024-10-12 22:24:09

归并与快速排序算法对处理同等规模的数据的对比的相关文章

算法浅谈——分治算法与归并、快速排序(附代码和动图演示)

在之前的文章当中,我们通过海盗分金币问题详细讲解了递归方法. 我们可以认为在递归的过程当中,我们通过函数自己调用自己,将大问题转化成了小问题,因此简化了编码以及建模.今天这篇文章呢,就正式和大家聊一聊将大问题简化成小问题的分治算法的经典使用场景--排序. 排序算法 排序算法有很多,很多博文都有总结,号称有十大经典的排序算法.我们信手拈来就可以说上来很多,比如插入排序.选择排序.桶排序.希尔排序.快速排序.归并排序等等.老实讲这么多排序算法,但我们实际工作中并不会用到那么多,凡是高级语言都有自带的

【排序】快速排序算法

特别说明: 对于算法,重在理解其思想.解决问题的方法,思路.因此,以下内容全都假定待排序序列的存储结构为:顺序存储结构. 快速排序介绍 快速排序算法相较于插入.冒泡.选择排序来说而言要稍微复杂些.其主要用的是分治思想,将问题划分为更小的子问题来解决.因此,快速排序的思想其实很简单.在(目前的)时间复杂度为  的排序算法中,快速排序的系数是最小的.因此,在平均情况下,快速排序算法是被认为最快的一种排序算法(要不怎么称之为快速排序呢?). 快速排序算法在大数据量情况下,实践证明在平均情况下的排序算法

iOS算法(一)置快速排序算法

快速排序是当遇到较大数据时,排序快,高效的方法(公司面试时,基本上会被问到...) 该方法的基本思想是: 1.先从数列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边. 3.再对左右区间重复第二步,直到各区间只有一个数. 简单地理解就是,找一个基准数(待排序的任意数,一般都是选定首元素),把比小于等于基准数的元素放到基准数的左边,把大于基准数的元素放在基准数的右边.排完之后,在把基准数的左边和右边各看成一个整体, 左边:继续选择基准数把小于等

快速排序算法小结

         快速排序是对冒泡排序的一种改进.它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列.          假设要排序的数组是a[6],长度为7,首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序.一躺快速排序的算法是: 1).设

排序算法之 Java简单快速排序算法

package net.qh.test.sort; import java.util.ArrayList; import java.util.Calendar; import java.util.List; /** * Created by Administrator on 2016/03/01. */ public class SimpleQuick { public int[] sort(int[] arr,int left,int right){ if ( arr == null || a

快速排序算法

快速排序的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的. 稳定性:快速排序是不稳定的排序 时间复杂度: 最好:O(nlogn) 最差:O(n^2) 辅助空间:O(logn) ~ O(n) /* 快速排序算法 */ #include <cstdio> /* 对给定的闭区间进行快速排序 */ void QSort(int* L, int low, int high){ if (low

关于快速排序算法(一个90%的人都不懂其原理、99.9%的人都不能正常写出来的算法.)

一.奇怪的现象 研究快速排序很久了,发现一个古怪的实情:这算法描述起来很简单,写一个正确的出来实在不容易.写一个优秀的快速排序算法更是难上加难. 也难怪该算法提出来过了很久才有人写出一个正确的算法,过了很久才优秀的版本出来. 二.原理描述 从数列中挑出一个元素,称为 "基准"(pivot), 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边).在这个分区退出之后,该基准就处于数列的中间位置.这个称为分区(partition)操作

排序算法--快速排序算法解析

一.快速排序算法思路 ①.取待排序列表的第一个元素p,通过归位算法,挪移他到列表中正确的位置. ②.列表被元素p分成两部分,左边都比元素p小,右边都比元素p大. ③.通过递归,在两部分,重复1.2步骤,直至列表有序. 归位算法动画演示: 二.快速排序算法代码示例 1 def partition(l,left,right):#归位算法 2 temp = l[left] #保存归位元素 3 while left <right: 4 while l[right]>=temp and left<

三路快速排序算法

1.三路快速排序算法的基本思想 之前的快速排序算法都是将序列分成<=v和>v或者是<v和>=v的两个部分,而三路快速排序是将序列分成三个部分: <v.=v.>v,如下图所示: 首先v元素还是作为"基准"元素,e表示当前遍历索引值指向的元素,也就是待考虑的元素,从图中可以看出来,整个序列被分成 3个部分,也就是说当我们遍历完成之后整个序列就已经被分成了<v.=v.>v三个部分了,而我们只需要对<v和>v的两个部分 再次递归调用三