每日四个小算法 --- day1

/*

求解a^b的最后三位数
思路:二分法和递归的结合使用,只要后三位,所以只留后三位一定是正确的。所以int类型就可以。

*/

将b的数分情况考虑:

当 b == 0时,返回 1

当 b == 1时候, 返回 或者 a <= 1时候返回 a %1000,此时如果 a小于等于1的话

当 b == 2时候, 返回 a*a %1000

当 b 大于等于三时候,分两种情况

当 b为奇数和b为偶数时候,根据公式 a^b = (a^(b/2))^2进行递归

代码:

int getNumber(int a, int b)
{
	if(b == 0)
		return 1;
	else if(a <= 1 || b == 1){
		return a%1000;
	}else if(b == 2){
		return a*a%1000;
	}else if(b & 0x01 == 1)//此时 b 大于等于 3 且是奇数
	{
		return((getNumber(getNumber(a, b/2), 2)*a) % 1000); // a^3 = a*a^2
	}else{
		return ((getNumber(getNumber(a, b/2), 2)) % 1000);
	}
}

二马桶排序

/*
	马桶排序:
		特点:数组的下标是该数字,数组的元素是该数字出现的频率。
		可以将待排序的数字看成是马桶,在里面进行插旗运算。
*/
void sort(int *score, int n)
{
	int newScore[9] = {0};
	int i = 0;
	int j = 0;
	for(i  = 0; i < 5; i++){
		newScore[score[i]]++;
	}
	for(i = 0; i < 9; i++){
		if(newScore[i] != 0){
			for(j = 0; j < newScore[i]; j++){//数组元素是数字出现的频率
				printf("%d ", i);//下标是真实出现的数字
			}
		}
	}
}
三冒泡排序

/*
		冒泡排序:
				5个数字进行排序,第一趟比较这个五个数字,并且比较的时候进行交换。
				第一趟选出最小的数字放到最高位。
				第二趟从前四个数字选出最小的位置,放到了第四位。
				第三趟就是从前三个数字选出最小的,放到了第三位。
				第四趟就是.......................,放到了第二位。
				外循环控制要遍历数组的次数,内循环控制比较数组起始位置和比较次数。
时间复杂度: o(n^2)
*/
void sort(int *a, int n)
{
	int i = 0;
	int j = 0;
	int temp = 0;
	for(i = 0; i < n-1; i++){
		for(j = 0; j < n-1-i; j++){
			if(a[j] > a[j+1]){
				temp = a[j];
				a[j] = a[j+1];
				a[j+1] =temp;
			}
		}
	}
}
四:快速排序

/*
	快速排序:
		首先定义基准变量为temp = a[0];
		一次快速排序的过程:首先确定 left < right
		然后定义左侧的数字为基准数,int temp = a[left];
		假设从小到大比较,则基准数左侧要小于基准数,基准数右侧的数,大于基准数。
		首先每次一定要从基数的对面开始,假设J是基数的对面,i是奇数,则如果a[j] >= temp,执行j--
		就是找到一个小于基数的,这个数字不应该放在基数的对侧,应该放在同侧。
		然后在基数的同侧找一个比基数大的数字,这个数字不应该在基数的同侧。
		然后进行交换,最后当 i == j 的时候,这个数组已经被遍历完成,此时将基数放在中间。
		对基数左侧的数字进行上述过程。
		对基数右侧的数字进行上述过程。
*/
void quickSort(int *a, int left, int right)
{
	int temp; //基准数
	int t;//交换的时候使用
	int i = left;//记录基数同侧的数
	int j = right;//记录基数对侧的数
	if(left > right)
		return;//递归结束条件
	temp = a[i];//左侧是基准值
	while(i != j)//进行一次快速排序的过程,结束条件是 i , j
	{
		//每次先从基准数的对侧开始,要就找出小于 基准数的
		while(temp <= a[j] && i < j){
			j--;
		}	
		while(temp >= a[i] && i < j){
			i++;
		}
		if(i != j){
			t = a[i];
			a[i] = a[j];
			a[j] = t;
		}
	}
	//一次完成后将基数归位
	a[left] = a[i];
	a[i] = temp;
	quickSort(a, left, i-1);//从基数左侧开始排序。
	quickSort(a, i+1, right);//从基数右侧的开始排序。
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值