左程云算法菜手班整理(一)

左程云算法新手班

1.位运算

整数,打印32位状态,注意左移右移的使用。没有带符号左移,左移只有不带符号的,右移带符号不代符号都有。
左移就是右侧拿0来补,左移以为,等同于num*2的值。

//左神打印数字32位(0-31)
void print32(int num)
{
	for (int i = 31; i >= 0; i--)
	{
		cout << ((num&(1 << i)) == 0 ? "0" : "1" );
	}
};

取反加1相当于负

	int d = 2121321;
	int e = -d;
	int f = (~d + 1);
	print32(e);
	print32(f);

打印的结果是一样的
c++中最大数INT32_MAX;最小数INT32_MIN;
同时,c++不能像java一样,用>>>表示带符号右移。

2.求N个数的阶乘的和

给定一个数N,求1!+2!+3!+ …+(N-1)!+N!的值
两种代码对比,明显看出,利用之前结论的时间复杂度要好很多。

long factorial(int n);
long f1(int n)
{
	long ans = 0;
	for (int i = 1; i <= n; i++)
	{
		ans += factorial(i);
	}
	return ans;
}
long factorial(int n)
{
	long ans = 1;
	for (int i = 1; i <= n; i++)
	{
		ans *= i;
	}
	return ans;
}

long f2(int n)
{
	long ans = 0;
	long cur = 1;
	for (int i = 1; i <= n; i++)
	{
		cur = cur * i;
		ans += cur;
	}
	return ans;
}
int main()
{
	int n = 10;
	long a=f1(10);
	long b=f2(10);
	cout << a << endl;
	cout << b << endl;
}


3.选择排序

每遍历一趟,都通过比较遍历出最小的,放到最左侧,经过n趟后,数列变得有序。

void swap(int a[], int i, int j)
{
	int temp = a[i];
	a[i] = a[j];
	a[j] = temp;
}
void selectSort(int a[], int len)
{
	int minindex;
	for (int i = 0; i < len - 1; i++)
	{
		minindex = i;
		for (int j = i + 1; j < len; j++)
		{
			minindex = (a[minindex] > a[j]) ? j : minindex;
		}
		swap(a,minindex,i);
	}
}
void print(int a[], int n)
{
	for (int j = 0; j < n; j++)
	{
		cout << a[j] << " ";
	}
	cout << endl;
};
int main()
{
	int a[10] = { 8,1,3,2,4,121,13,4242,34321,21312 };
	cout << "初始序列:";
	print(a, 10);
	selectSort(a, 10);
	cout << "排序结果:";
	print(a, 10);
	system("pause");
	return 0;
}

选择排序是经典排序,理解后直接背过即可,一定要理解!!!

4.冒泡排序

思想:从最左边的数据开始,以此往右比较,两两比较中,最小的那个往上“冒”,称为冒泡排序,每趟排序都会确定当前无序序列中最右边的位置,即最大的位置。

void swap(int a[], int i, int j)
{
	int temp = a[i];
	a[i] = a[j];
	a[j] = temp;
}
void bubbleSort(int a[], int n)
{
	if (n < 2 || a == nullptr)
	{
		return;
	}
	for (int i = n - 1; i >= 0; i--)
	{
		for (int j = 0; j < i; j++)
		{
			if (a[j] > a[j + 1])
			{
				swap(a, j, j + 1);
			}
		}
	}
	return;
}
void print(int a[], int n)
{
	for (int i = 0; i < n; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;
}
int main()
{
	int a[10] = { 123123,321312,1,2,4,3,5,8,8656,545 };
	cout << "初始序列:";
	print(a, 10);
	cout << "选择排序后:";
	bubbleSort(a, 10);
	print(a, 10);
	system("pause");
	return 0;
}

5.插入排序

像扑克牌一样,无序序列中的最左的元素直接插入到有序序列的该插入的位置。称为插入排序。过程有点类似于冒泡排序,需要两两之间做比较。
大体都是一样的,但是冒泡排序是相邻(j和j+1)之间交换,而插入排序是跳跃着(i和j)之间进行交换。

#include
using namespace std;

void swap(int a[], int i, int j)
{
	int temp = a[i];
	a[i] = a[j];
	a[j] = temp;
}
void insertSort(int a[], int n)
{
	if (a == nullptr || n < 2)
	{
		return;
	}
	for (int i = 0; i <= n - 1; i++)
	{
		for (int j = 0; j < i; j++)
		{
			if (a[j] > a[i])
			{
				swap(a, i, j);
			}
		}
	}
	return;
}
void print(int a[], int n)
{
	for (int i = 0; i < n; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;
}
int main()
{
	int a[10] = { 123123,321312,1,2,4,3,5,8,8656,545 };
	cout << "初始序列:";
	print(a, 10);
	cout << "选择排序后:";
	insertSort(a, 10);
	print(a, 10);
	system("pause");
	return 0;
}

与对数器有关的,下次在补充

你可能感兴趣的:(算法,c++,排序算法)