算法设计基础

  1. 分别用穷举法和欧几里德算法实现求两个整数的最大公约数,并比较算法的效率。
#include <iostream>
using namespace std;
int qiongjufa(int x, int y)
{
	int i, n;
	n = x;
	if (n > y)
		n = y;
	for (i = n; i > 0; i--)
	{
		if (x%i == 0 && y%i == 0)
			break;
	}
	return i;
}
int oumm(int a, int b)
{
	int r,t;
	if (a < b)
	{
		t = a;
		a = b;
		b = t;
	}
	while (a%b)
	{
		r = a % b;
		a = b;
		b = r;
		r = a % b;
	}
	return b;

}
int main()
{
	int m, n;
	cin >> m;
	cin >> n;
	cout << "穷举法求得" <<m<<","<<n<<"的最大公约数为:"<< qiongjufa(m, n) << endl;
	cout << "欧几里得算法求得" << m << "," << n << "的最大公约数为:" << oumm(m, n) << endl;
	return 0;
}

运行截图:
在这里插入图片描述

  1. 排序算法效率比较。编程实现以下几种不同的排序算法(以升序为例):冒泡排序、选择排序、 希尔排序、快速排序,比较不同的排序过程的运行时间。具体要求:(1)为了消除数据之间差异导致排序效果的影响,使用相同的数组进行排序,方法为:首先创建一个数组,数组长度至少为100000,数组元素取值范围在[0, 100000]之间的随机正整数,并将这个数组复制4份,分别用不同的排序算法进行排序。(2)记录不同排序算法的运行时间。(3)对完全逆序的情况进行测试,将待排序数组赋值为逆序,即与最终排序要求完全相反。
#include <iostream>
#include <ctime>
#define N 100000
using namespace std;
void maopao(int a[])
{
	int i, j,t;
	for (i = 0; i < N-1; i++)
	{
		for (j = 0; j < N-i; j++)
		{
			if (a[i] > a[i+1])
			{
				t = a[i];
				a[i]= a[i+1];
				a[i+1] = t;
			}
		}
	}
}
void choose(int a[])
{
	int i,t,j;
	for (i = 0; i < N-1; i++)
	{
		for (j = i + 1; j < N; j++)
		{
			if (a[i]>a[j])
			{
				t=a[i];
				a[i] = a[j];
				a[j] = t;
			}
		}
	}
}
void QuickSort(int array[], int start, int last)
{
	int i = start;
	int j = last;
	int temp = array[i];
	if (i < j)
	{
		while (i < j)
		{
			//
			while (i < j &&  array[j] >= temp)
				j--;
			if (i < j)
			{
				array[i] = array[j];
				i++;
			}

			while (i < j && temp > array[i])
				i++;
			if (i < j)
			{
				array[j] = array[i];
				j--;
			}

		}
		//把基准数放到i位置
		array[i] = temp;
		//递归方法
		QuickSort(array, start, i - 1);
		QuickSort(array, i + 1, last);
	}
}

//希尔排序
void shellSort(int a[], int len)
{
	int insertNum = 0;
	int INCRGAP = 2;
	unsigned gap = len / INCRGAP ; // 步长初始化,注意如果当len<INCRGAP时,gap为0,所以为了保证进入循环,gap至少为1!!!
	while (gap) // while gap>=1
	{
		for (unsigned i = gap; i < len; ++i) // 分组,在每个子序列中进行插入排序
		{
			insertNum = a[i];//将当前的元素值先存起来方便后面插入
			unsigned j = i;
			while (j >= gap && insertNum < a[j - gap])//寻找插入位置
			{
				a[j] = a[j - gap];
				j -= gap;
			}
			a[j] = insertNum;
		}
		gap = gap / INCRGAP;
	}
}

int main()
{
	int a[N];
	int i,count=0;
	clock_t startTime_m, endTime_m,startTime_c,endTime_c,startTime_x,endTime_x,startTime_f,endTime_f;
	for (i = 0; i < N; i++)
	{
		 a[i]=rand()%100000+0;
		 //cin >> a[i];
	}
	/*cout << "产生的随机数为:" << endl;
	for (i = 0; i < N; i++)
	{
		cout << a[i] << " ";
		count++;
		if (count % 1000 == 0)
			cout << a[i] << " ";
	}*/
	startTime_m = clock();
	maopao(a);
	endTime_m = clock();
	cout <<"冒泡排序法的运行时间为:"<< endTime_m - startTime_m << endl;
	startTime_c = clock();
	choose(a);
	endTime_c = clock();
	cout << "选择排序法的运行时间为:" << endTime_c - startTime_c << endl;
	/*startTime_f = clock();
	QuickSort(a,0,N-1);
	endTime_f = clock();
	cout << "快速排序法的运行时间为:" << endTime_f - startTime_f << endl;
	*/
	startTime_x = clock();
	shellSort(a,N);
	endTime_x = clock();
	cout << "希尔排序法的运行时间为:" << endTime_x - startTime_x << endl;
	return 0;
}

运行截图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值