判断素数:判断一个数是否是素数,n不必被2~(n-1)的整数整除,只需被2~n/2之间的整数整除即可,甚至只需要被2~根号n之间的整数整除即可。
最大公约数求法: a与b的最大公约数是指能同时整除a与b的最大的整数
- 更相减损之术:以两数中较大的数减去较小的数,获得的差与原先较小的数构成新的一对数,再以大的数减去小的数,依次循环。例如:(12,16)?(12,4)?(8,4)?(4,4)最大公约数为4
- 辗转相除法(欧几里得算法):用较大的数除以较小的数,余数和较小的数构成新的一对数,继续上面的除法,直到大数被小数除尽为止,则较小的数就是最大公约数。例如:(288,123)?(42,123)?(42,39)?(3,39)可见,3就是288和123的最大公约数
最小公倍数求法:a与b的最小公倍数是可以同时被a和b整除的最小整数
最小公倍数=a*b/最大公约数
查找的方法:
- 顺序查找:从表的一端开始,向另一端逐个进行记录的关键字和给定值的比较。若某个记录的关键字与给定值相等,则查找成功,并给出记录在查找表中的位置;若经过比较,所有记录的关键字与给定值都不相等,则查找失败,给出失败信息。
- 折半查找(二分法查找):要求查找表中的记录必须按关键字有序排列,并且查找表必须以顺序方式存储。其查找过程为:在有序的查找表中,取中间位置的记录作为比较对象,若给定值与中间位置记录的关键字相等,则查找成功;若给定值大于中间位置记录的值,则继续查找大的一边,若给定值小于中间位置记录的关键字值,则继续查找小的一边。依次不断重复上述查找过程,直到查找成功为止。若在查找范围内所有记录的关键字都与给定值不等,则查找失败。
排序的方法:
- 冒泡排序:冒泡排序是最为简单的一种排序,通过重复走完数组的所有元素,通过打擂台的方式两个两个进行比较,直到没有数可以交换的时候结束这个数,再到下个数,直到整个数组排好顺序。因一个个浮出所以叫冒泡排序。算法描述:
- 比较相邻两个数据,如果第一个比第二个大,就交换两个数;
- 对每一个相邻的数做同样的工作,这样从开始一队到结尾一队在最后的数就是最大的数;
- 针对所有元素做上面的操作,除了最后一个;
- 重复1~3,直到顺序完成。
代码可视化:
void BubbleSort(int arr[], int a)//冒泡排序算法
{
if (arr == NULL || a <= 0)
{
return;
}
int temp;
for (int i = 0; i < a; i++)
{
for (int j = i + 1; j < a; j++)
{
if (arr[i]>arr[j])
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
printf(arr, a);
}
- 选择排序:选择排序是最直观的排序,通过确认一个key最大或最小值,再从待排序的数中找出最大或最小的交换到对应位置。再选择次之。算法描述:
- 在一个长度为N的无序数组中,第一次遍历n-1个数找到最小的和第一个数交换;
- 第二次从下一个数开始遍历n-2个数,找到最小的数和第二个数交换;
- 重复以上操作直到第n-1次遍历最小的数和第n-1个数交换,排序完成。
算法描述:
void SelectSort(int arr[], int a)//选择排序
{
if (arr == NULL || a <= 0)
{
return;
}
for (int i = 0; i < a; i++)
{
int MinKey = arr[i];
for (int j = i; j < a; j++)
{
if (MinKey>arr[j])
{
int temp = arr[j];
arr[j] = MinKey;
MinKey = temp;
}
}
}
arr[i] = MinKey;
}
- 快速排序:快速排序是排除稳定性因素后最常用的排序。给看官介绍两种使用方法:一种是直接在头文件stdlib.h头文件中的qsort函数实现是和正常写代码一样的,通常使用qsort(数组名、长度、sizeof(第一个数长度)、complnc/comoDec)进行实现数组的排序,后面是通过递归调用的形式。算法描述:
- 从数列中挑出一个元素作为基准;
- 重新排列数列,把所有的比基准小的放在基准前面,反之放在后面(一样大可任意一边)完成后基准处在分区的中间位置;
- 通过递归调用把小于基准元素和大于基准元素的子序列进行排序。
代码实现:
//程序中可以通过 qsort函数调用
int compInc(const void* a, const void* b)//快排递增
{
return*(int*)a - *(int*)b;
}
int compDec(const void*a, const void*b)//快排递减
{
return *(int *)b - *(int *)a;
}
//直接使用即可
void quicksort(int left, int right)
{
int i, j, t, temp;
if (left > right)
{
return;
}
else
{
temp = a[left];//temp中存的就是基准数
i = left;
j = right;
while (i != j)
{
//顺序很重要,要先从右边开始找
while (a[j] >= temp && i < j)
{
j--;
}
//再找左边的
while (a[i] <= temp && i < j)
{
i++;
}
//交换两个数在数组中的位置
if (i < j)
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
//最终将基准数归位,放在第i个位置
a[left] = a[i];
a[i] = temp;
quicksort(left, i - 1);//继续处理左边的,这里是一个递归的过程
quicksort(i + 1, right);//继续处理右边的,这里是一个递归的过程
}