那么说到算法,所有学习算法的人都应该适当了解时间复杂度O(f(n))的概念,因为时间复杂度是用来评估一个算法好坏的标准之一,下面让我们简单了解下时间复杂度
定义:在一个完全理想状态下的计算机中,我们定义T(n)来表示程序执行所需要花费的时间,其中n代表数据输入量。f(n)表示执行与算法优劣和问题规模有关的执行数,O的作用则是去除其他项,包括与最高项相乘的常数,只保留最高项。
f(n)=2n2+1 - - > O(f(n))=O(n2)
f(n)=n2/10+2n - - > O(f(n))=O(2n)
#include
#define size 10
int main(void) {
int a[size] = {2,7,12,15,21,22,29,34,36,41};
int key, middle;
int left=0, right=size-1;
scanf("%d", &key);
while (left <= right) {
middle = (left + right) / 2;
if (a[middle] == key) {
printf("在数列第%d位中找到了%d", middle+1, key);
break;
}
else if (a[middle] < key)
left = middle + 1;
else
right = middle - 1;
}
if (left > right)
printf("在数列中没有找到当前数");
}
#include
int mergesort(int a[],int b[],int left,int right);//归并排序中分隔的函数
int merges(int a[],int t[],int left,int mid,int right);//归并排序中合并的函数
int main(void) {
int a[1000];//定义一个数列
int n;//人为要求数列的长度
int i;
scanf("%d", &n);
printf("放入需要排序的数列:");
for (i = 0;i < n;i++)
scanf("%d", &a[i]);
i = 0;
mergesort(a, a , i , n-1);//1.刚开始为一整个数列长度left,right为上下界 2.为什么传两个a数组进去?需要创建一个新数列来放排序后的数列
printf("排完后的数列为:");
for (i = 0;i < n;i++)
printf("%d ", a[i]);
}
int mergesort(int a[],int t[] ,int left,int right) {//利用分隔的思想,把当前数列不断分成两半
int mid;
int sor[1000];//新的数组用来放合并后的新数列
if (left == right) {//表示分到最后只剩下一个数,运用的是递归的思想
t[left] = a[right];//将a数组的所有值放入了sor中
}
else {
mid = (left + right) / 2;
mergesort(a,sor, left, mid);//对左边的继续分割
mergesort(a,sor, mid + 1, right);//对右边的继续分割
//函数做合并时,也是借助mergesort回去
merges(sor, t, left, mid, right);//对当前范围内的两个数列进行合并
}/*——————在倒数第二层做merges函数时,sor是最底层if语句满足时的t(a数组的赋值),t是再上一层传下来的sor,merges改变的是上一层的sor(这一层的t)的顺序*/
/*——————当你传到只剩两个的时候,做最后一遍merges,而这里的t是外面的a,所以改变外面a的值*/
return 0;
}
int merges(int a[], int t[], int left, int mid, int right) {//把两个数列第一项进行比较,最小的放到一个新数组,并在当前数列删去这个
//a为原数组,t为合并排序后的新数组
int i = left, j = mid + 1, k = left;//i表示第一个数列的上界,j表示第二个数列的上界,k表示合并数列的第一数
while (i <= mid && j <= right) {//判断两个数列都还有数
if (a[i] <= a[j]) {
t[k] = a[i];
i++;
k++;
}
else {
t[k] = a[j];
j++;
k++;
}
}//小的值放入
while (i <= mid)//两个while用来把剩下的数放入t新数组
t[k++] = a[i++];
while (j <= right)
t[k++] = a[j++];
return 0;
}
汉诺塔问题源自印度一个古老的传说,印度教的“创造之神”梵天创造世界时做了 3 根金刚石柱,其中的一根柱子上按照从小到大的顺序摞着 64 个黄金圆盘。梵天命令一个叫婆罗门的门徒将所有的圆盘移动到另一个柱子上,移动过程中必须遵守以下规则:
(1)每次只能移动柱子最顶端的一个圆盘;
(2)每个柱子上,小圆盘永远要位于大圆盘之上
很显然在汉诺塔问题的解决中,思想也是运用了递归和分治法(递归和分治法就像一对孪生兄弟,思想都是将复杂问题简单化)。
而当有n个盘子时,它的思想也是一样的,步骤为:
本章不重点展示汉诺塔的代码,想要了解可以关注后续博客。