算法与分析-实验一 算法设计基础

1. 分别用穷举法和欧几里德算法实现求两个整数的最大公约数,并比较算法的效率。
核心代码:

class Solution {
public:
	int eaMethod(int a,int b) {//穷举法
		int res=1;
		int times = a>b?a:b;
		for (int i = 1; i <=times;i++) {
			if (a % i == 0 && b % i == 0)
				res = i;
		}
		return res;
	}
	int gcdMethod(int a,int b) {//欧几里德算法
		if (b == 0) return a;
		else return gcdMethod(b,a%b);
	}
};

2. 排序算法效率比较。编程实现以下几种不同的排序算法(以升序为例):冒泡排序、选择排序、 希尔排序、快速排序,比较不同的排序过程的运行时间。具体要求:(1)为了消除数据之间差异导致排序效果的影响,使用相同的数组进行排序,方法为:首先创建一个数组,数组长度至少为100000,数组元素取值范围在[0, 100000]之间的随机正整数,并将这个数组复制4份,分别用不同的排序算法进行排序。(2)记录不同排序算法的运行时间。(3)对完全逆序的情况进行测试,将待排序数组赋值为逆序,即与最终排序要求完全相反。
核心代码:

class Solution {
public:
	void bubbleSort(int nums[], int len1) {
		int len = len1;
		for (int i = 0; i < len; i++) {//控制总的趟数
			for (int j = 1; j < len - i; ++j) {//一次冒泡排序的结果
				if (nums[j - 1] > nums[j]) swap(nums[j - 1], nums[j]);
			}
		}
	}
	
	void insertionSort(int arr[], int n)
	{
		int i, j, key;
		for (i = 1; i < n; i++)
		{
			key = arr[i]; j = i - 1;
			while (j >= 0 && arr[j] > key)
			{
				arr[j + 1] = arr[j];
				j--;
			}
			arr[j + 1] = key;
		}
	}
	void shellSort(int arr[], int len)//希尔排序
	{
		int tmp;
		int  i;
		for (int d = len / 2; d > 0; d /= 2)
		{
			for (int j = d; j < len; ++j)
			{
				tmp = arr[j];
				for (i = j; i >= d && arr[i - d] > tmp; i -= d)
					arr[i] = arr[i - d];
				arr[i] = tmp;
			}
		}
	}

	void selectionSort(int arr[], int len)//选择排序
	{
		for (int i = 0; i < len - 1; ++i)
		{
			int index = i;
			for (int j = i + 1; j < len; ++j)
			{
				if (arr[index] > arr[j])
					index = j;
			}
			swap(arr[index], arr[i]);
		}
	}
	int getStandard(int array[], int i, int j) {
		//基准数据 
		int key = array[i];
		while (i < j) {
			//因为默认基准是从左边开始,所以从右边开始比较 
			//当队尾的元素大于等于基准数据 时,就一直向前挪动 j 指针 
			while (i < j && array[j] >= key) {
				j--;
			}
			//当找到比 array[i] 小的时,就把后面的值 array[j] 赋给它 
			if (i < j) {
				array[i] = array[j];
			}
			//当队首元素小于等于基准数据 时,就一直向后挪动 i 指针 
			while (i < j && array[i] <= key) {
				i++;
			}
			//当找到比 array[j] 大的时,就把前面的值 array[i] 赋给它
			if (i < j) {
				array[j] = array[i];
			}
		}
		//跳出循环时 i 和 j 相等,此时的 i 或 j 就是 key 的正确索引位置
		//把基准数据赋给正确位置 
		array[i] = key;
		return i;
	}

	void QuickSort(int array[], int low, int high) {
		//开始默认基准为 low
		if (low < high) {
			//分段位置下标 
			int standard = getStandard(array, low, high);
			//递归调用排序
			//左边排序 
			QuickSort(array, low, standard - 1);
			//右边排序 
			QuickSort(array, standard + 1, high);
		}
	}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值