C/C++之常用算法总结(一)

#include "myheadfile.h"
#include <ctime>


using namespace std;

#define ARRAY 10

void myInputArray()
{
	int Array[ARRAY];
	for (int i = 0; i < ARRAY; i++)
	{
		printf("%d", Array[i]);
	}
	printf("\n");
	
}
void BubbleSort(int* a, int len)
{
	for (int i = 0; i < len-1; i++)
	{
		for (int j = 0; j < len - i; j++)
		{
			if (a[j] > a[j + 1])
			{
				int temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
		}
	}

	for (int i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
}


void SelectSort(int* a, int len)
{
	for (int i =0; i < len - 1;i++)
	{
		for (int j = i+1; j < len; j++)
		{
			if (a[i] > a[j])
			{
				int temp = a[i];
				a[i] = a[j];
				a[j] = temp;
			}
		}
	}
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
}

void InsertSort(int* a, int len)
{
	for (int i = 1; i < len; i++)
	{
		int temp = a[i],j;
		for (j = i; j > 0 && a[j - 1]>temp; j--)
		{
			a[j] = a[j - 1];
		}
		a[j] = temp;
		
	}
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
}


void Insertion_Sort(int a[], int n)
{
	int i, j;
	for (i = 1; i < n; i++)  //假设第一个数为有序序列,所以数组下标从一开始
	{
		int temp = a[i];    //从无序序列中取一个数为待插入数字,与有序序列中的数进行比较,找到合适的位置插入其中
		for (j = i; j > 0 && a[j - 1] > temp; --j)  //判断条件为两个,j>0为数组边界判断,a[j-1]>temp为插入的判断条件
		{
			a[j] = a[j - 1];
		}
		a[j] = temp;  //找到合适的位置插入其中

	}
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
}

void quickSort(int a[],int left,int right)
{
	int tleft, tright;
	tright = right;
	tleft = left;
	int f = a[(right+left) / 2];
	while (tleft < tright)
	{
		while (a[tleft] < f)
		{
			tleft++;
		}
		while (a[tright]>f)
		{
			tright--;
		}
		if(tleft<=tright)
		{
			int temp = a[tleft];
			a[tleft] = a[tright];
			a[tright] = temp;
			tright--;
			tleft++;
		}
		if (tright == tleft)
		{
			tleft++;
		}
		if (left<tleft)
		{
			quickSort(a, left, tleft);
		}
		if (tleft < right)
		{
			quickSort(a, tleft, right);
		}
	}
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
}

int searchFunc(int* a, int len, int X)
{
	int low, high, mid;
	low = 0,high = len - 1;
	while (low <= high)
	{
		mid = (low + high) / 2;
		if (a[mid] == X)
		{
			return X;
		}
		else if (a[mid] > X)
		{
			high = mid-1;
		}
		else
		{
			low = mid + 1;
		}
	}

	return -1;
}

/*
多项式计算:
a[]是多项式系数项组成的数组
n为最高次加1
x是在x处取值
*/


double polymadial(double a[], int n, double x)
{
	int i;
	double result;
	result = a[n - 1];
	for (i = n - 2; i >= 0; i--)
	{
		result = result * x + a[i];
	}
	return result;
}
/*
要生成每次都不一样的比较真实一点的随机数需要使用时间种子函数srand配合rand函数

rand函数直接生成的随机数是伪随机数
*/
void Random(int n)
{
	srand((int)time(0));
	//生成的是0-32767之间的数字
	cout << "直接输出固定范围:0-32767" << endl;
	for (int i = 0; i < n; i++)
	{
		printf("%d ", rand());
	}
	cout << endl;
	cout << "如果要生成固定范围内的数:0-100" << endl;
	for (int i = 0; i < n; i++)
	{
		printf("%d ", rand()*100/32767);
	}
	cout << endl;
	cout << "如果要生成固定范围内的数:200-300" << endl;
	for (int i = 0; i < n; i++)
	{
		printf("%d ", 200+rand() * 100 / 32767);
	}
	cout << endl;
}

double mysqrt(double x, double esp)
{
	double result = x;
	double t = 0.0;
	while (result - t > esp)
	{
		t = result;
		result = 1 / 2 * (t + x/t);
	}
	return result;
}

void absolutNum(int n)
{
	int result = 0;
	for (int i = 1; i < n; i++)
	{
		if (n % i == 0)
		{
			result += i;
		}
		else
		{
			continue;
		}
	}
	if (result == n)
	{
		cout << n <<"是一个完全数!"<< endl;
	}
	else
	{
		cout << n<<"不是一个完全数!" << endl;
	}
}



void intimate(int n)
{
	for (int i = 1; i < n; i++)
	{
		for (int j = i + 1; j < n; j++)
		{
			if (j % i == 0)
			{

			}
		}
	}
}



int main()
{
	Random(10);
	absolutNum(6);
	absolutNum(28);
	absolutNum(16);
	return 0;
}

/*

求城市之间的最小距离:
实际求最小生成树


最小生成树的概念:
1、子图的顶点于原图一样
2、子图中的顶点不构成回路
3、子图是原图的一个子集,这部分恰好将原图所有顶点链接

一句话概括包含原图所有顶点并且能够链接所有顶点不包含回路的子图就是最小生成树.

实际问题中需要带权值有向图

计算所有上述子图中带权值的累加和,权值最小的那个子图即为原图的最小生成树

如何得到最小生成树:
原图集合记为V,最小生成树集合记为U
开始时,V包含所有顶点,U为空集
从V中选取一个顶点V1加入U集合中,找出计算与V1相邻的顶点到V1的距离
将距离最小V0的添加至U中
之后再V剩余的集合中计算与V1/V0相邻中距离最小的顶点,将其添加至U中
如此方式,直到所有的顶点都添加至U中
即最小生成树.

*/

/*
括号匹配:
括号匹配用到了栈数据结构,操作步骤如下;
1.首先输入一个字符,当该字符是括号时,程序进入循环处理
2、如果是左括号,则将其入栈,继续执行1步骤
   如果是右括号,则取出栈顶数据进行比对,如果匹配就不操作
   如果不匹配,需要将刚才取出的栈顶元素重新入栈,
   再将刚才输入的括号也入栈.
3、然后再输入下一个字符,重复执行,直到所有的字符都得到操作为止.

*/

/*
完全数:
一个数等于它所有真因子的和.(真因子  整除但不包括这个数本身)


亲密数;
两个数的包含1但不包含其本身的真因子的累积和等于对方,则互称为亲密数.

*/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值