左神起百算,成机算法魂


在这里插入图片描述

百算前言

由于是刷题博文不会写的比知识博文细致的,简单的题我可能只会贴代码,但是一般以我的性格简单的我也会标一标,所以我不会裸代码上去,百算暂时先用左神新手课来入局,后面就是神之战,百家百算。因为百算成机这个栏目是大厂敲门砖那个栏目的高度实现。

不会很细致的标明,因为我想刷多点题

第一算


1.打印一个数的32位格式

image-20220113185816860

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;

void Print32(int num) {
	int i = 0;
	for (i = 31; i >= 0; i--) {
		printf((num & (1 << i)) == 0 ? "0" : "1");
	}
	cout << endl;
}

int main()
{
	//看一下整形最大值
	int test = INT_MAX;
	//整形最小
	int test2 = INT_MIN;
	Print32(test);
	Print32(test2);
	return 0;
}

2.给定一个参数N 返回1!+2!+…+N!

image-20220113194410252

long FactSum(int num) {
	int i = 0;
	long sum = 0;
	long cur = 1;
	for (i = 1; i <= num; i++) {
		cur *= i;
		sum += cur;
	}
	return sum;
}

int main()
{
	cout << FactSum(10) << endl;
	return 0;
}

3.选择排序

升级的选择排序

image-20220113210118888

//数组打印
void PrintArray(int* array,int n) {
	int i = 0;
	for (i = 0; i < n; i++) {
		cout << array[i] << " ";
	}
	cout << endl;
}

//元素交换
void Swap(int* px, int* py) {
	int tmp = *px;
	*px = *py;
	*py = tmp;
}

//选择排序  
//为了提高量的效率 我们一趟就把范围内最大最小
//都取出来放到正确的位置上
void SelectSort(int* array, int n) {
	//首先考虑边界 空数组或单元素数组就直接返回
	if (!n || n == 1)
		return;
	//不空就继续
	//头标
	int begin = 0;
	//尾标
	int end = n - 1;
	while (begin < end)
	{
		 //最小元素位置
		int MinIndex = begin;
		//最大元素位置
		int MaxIndex = end;
		int i = 0;
		for (i = begin; i <= end; i++) {
			//找最小
			if (array[i] < array[MinIndex])
				MinIndex = i;
			//找最大
			if (array[i] > array[MaxIndex])
				MaxIndex = i;			
		}
		//找完再交换
		Swap(&array[begin], &array[MinIndex]);
		if (begin == MaxIndex)
			//如果最大数就是begin位置的,那么交换的时候最大数连带着下标一起动
			MaxIndex = MinIndex;
		Swap(&array[end], &array[MaxIndex]);
		begin++;
		end--;
	}	
}

int main() {
	//随便创建一个数组
	int a[] = { 5,8,54,6,5,0,4,55,8,84,4,1 };
	//打印交换前的
	PrintArray(a, sizeof(a) / sizeof(a[0]));
	//交换一下
	SelectSort(a, sizeof(a) / sizeof(a[0]));
	//打印交换后的
	PrintArray(a, sizeof(a) / sizeof(a[0]));
	return 0;
}

3.冒泡排序

image-20220113220206472

//数组打印
void PrintArray(int* array, int n) {
	int i = 0;
	for (i = 0; i < n; i++) {
		cout << array[i] << " ";
	}
	cout << endl;
}

//元素交换
void Swap(int* px, int* py) {
	int tmp = *px;
	*px = *py;
	*py = tmp;
}

void BubbleSort(int* array, int n) {
	if (!array || n<2)
		return;
	int i = 0;
	for (i = 0; i < n - 1; i++) {
		//交换标记
		int flag = 0;
		int j = 0;
		for (j = 0; j < n - 1 - i;j++) {
			if (array[j] > array[j + 1]) {
				//交换标记置1
				flag = 1;
				Swap(&array[j],&array[j+1]);
			}
		}
		if (!flag)
			break;
	}
}

int main() {
	//随便创建一个数组
	int a[] = { 5,8,54,6,5,0,4,55,8,84,4,1 };
	//打印交换前的
	PrintArray(a, sizeof(a) / sizeof(a[0]));
	//交换一下
	BubbleSort(a, sizeof(a) / sizeof(a[0]));
	//打印交换后的
	PrintArray(a, sizeof(a) / sizeof(a[0]));
	return 0;
}

4.插入排序

image-20220113225812876


//数组打印
void PrintArray(int* array, int n) {
	int i = 0;
	for (i = 0; i < n; i++) {
		cout << array[i] << " ";
	}
	cout << endl;
}

//元素交换
void Swap(int* px, int* py) {
	int tmp = *px;
	*px = *py;
	*py = tmp;
}
//插入排序
void InsertSort(int* array, int n) {
	if (!array || n < 2)
		return;
	//0-0  一个元素是好的
	//0-1
	//0-2
	//0-n  这些范围变,变的就是end
	int end = 1;
	for (end = 1; end < n; end++) {
		//新来的数在end这个位置上面
		int cur = end;
		//向前跑
		while (cur - 1 >= 0 && array[cur - 1] > array[cur]) {
			//交换
			Swap(&array[cur - 1], &array[cur]);
			//向前移
			cur--;
		}		
	}
}

int main() {
	//随便创建一个数组
	int a[] = { 5,8,54,6,5,0,4,55,8,84,4,1 };
	//打印交换前的
	PrintArray(a, sizeof(a) / sizeof(a[0]));
	//交换一下
	InsertSort(a, sizeof(a) / sizeof(a[0]));
	//打印交换后的
	PrintArray(a, sizeof(a) / sizeof(a[0]));
	return 0;
}
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>