shell其实就是一个命令解释器
数组的查找
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main()
{
time_t ts;//时间数据类型
unsigned int num = time(&ts);//获取时间,转换为整数
srand (num);//初始化随机数种子
int a[10];
for(int i=0;i<10;i++)
{
a[i]=rand()%100;//取随机数限定100以内
printf("%d\n",a[i]);
}
for(int i=0;i<10;i++)
{
if(a[i]==10)
{
printf("find");
break;
}
}
}
1024个人,有一个人有艾滋病。需要血液检测。
如何快速找出这个人。
所有人血液都采取过来。把512个人血液混合起来
512 512 1次淘汰512个人
256 256 2次淘汰256个人
128 128 3次淘汰128个人
64
32
16
4
2
1
二分查找法(数据必须是有序的)
void main()
{
int a[128];
for(int i=0;i<128;i++)
{
a[i]=i;
}
printf("%p",a);
int num=333;
int shang = 0;
int xia =1023;
int zhong;
while(shang < xia )
{
zhong =(shang +xia)/2;//取一个中间值
cout<<shang<<","<<zhong<<","<<xia<<endl;
if(num =a[zhong])
{
printf("找到了");
break;//跳出循环
}
else if(num>a[zhong])
{
shang=zhong +1;
}else
{
xia =zhong -1;
}
}
}
1 8 2 7 3 6 4 5 拆分成4个序列,中间间隔4。拆分好后序列间排序
1 3
8 6
2 4
7 5
1 3
6 8
2 4
5 7
1 6 2 5 3 8 4 7 排好序后合并起来
拆分成2个序列,中间间隔2。拆分好后序列间排序
1 2 3 4
6 5 8 7
1 2 3 4
5 6 7 8
1 5 2 6 3 7 4 8
拆分成2个序列,中间间隔2。拆分好后序列间排序
1 2 3 4 5 6 7 8
#include <stdio.h>
#include <stdlib.h>
void show(int *p,int n)
{
for(int i=0;i<n;i++)
{
cout<<"\t"<<p[i];
}
}
void shellSort(int *p,int length)
{
int d=length/2;//曾量
while(d>=1)//曾量终止的条件
{
for(int i=d;d<length && i<length;i++)//每个曾量都要循环一次
//i是最后的位置
{
int x=p[i];//备份
int j=i-d;//前面一个元素
while(j>=0 && p[j]>x)//在数组的范围内
{
a[j+d]=p[j];
j=j-d;//每次
}
p[j+d]=x;
show(p,8);
}
d /= 2;//或d--
}
}
太复杂可以使用多线程来优化
void main()
{
int a[8]={1,8,2,7,3,6,4,5};
show(a,8);
shellSort(a,8);
show(a,8);
}
定义指向函数的指针变量的一般形式为:
数据类型(*指针变量名)(函数参数列表);
如 int(*p)(int,int)
p=max;
p(1,4);
编译器会自动将函数名转换成函数地址
数据结构:数据之间的关系,提高程序效率
逻辑关系:
集合:在一个范围内有多个数据,数据之间没有关系
线性:1对1关系
树型:1对多
图:多对多
物理关系:内存存储
顺序存储:数组
链式存储:链表
求10的阶乘的和
int n=10;
int num1=1;
int num2=1;
for(int i=1;i<=n;i++)
{
num1=1;
for(int j=2;j<=i;j++)
{
num1*=j;
}
sum+=num1;
}
写一个数组,数组每一位存一位数,就可以保存一个很大的数
3 7 2
18
1计算每一位的结果
54 126 36
2进位和留位
54 126 36
6
3
12
66 9 6
int length=20
int *arr=new int[length];
arr[length-1]=2;
arr[length-2]=7;
arr[length-3]=3;
int num=16;
for(int i=0;i<length;i++)
{
arr[i]*=num;//计算每一位
}
//进和留
for(int i=length-1;i>0;i--)
{
arr[i-1]+=arr[i]/10;
arr[i]=arr[i]%10;
}
for(int i=0;i<length;i++)
{
cout<<arr[i]<<" ";
}
int n=50;
int[] ints = new int[100]
ints[ints.length-1]=1;
for(int i=1;i<=n;i++)
{
ints=demo(ints,i)
}
for(int i=0;i<ints.length;i++)
{
cout<<ints[i];
}
static int[] demo(int[] ints,int num)
{
for(int i=0;i<ints.length;i++)
{
ints[i]*=num;
}
//进和留
for(int i=ints.length-1;i>0;i--)
{
ints[i-1]+=ints[i]/10;
ints[i]=ints[i]%10;
}
}
两个大数字的乘积
作业:
使用两个数组相乘的数字作为一个数组返回。
排序:
冒泡排序:
for(int i=0;i<n;i++)
{
for(int j=i;j<n;j++)
{
swap();
}
}
插入排序:
void Insert_Sort(int a[],int n)
{
int temp=0;
for(int i=1;i<n;i++)
{
if(a[i]<a[i-1])
{
temp=a[i];
for(int j=i-1;a[j]>temp && j>=0;j--)
{
a[j+1]=a[j];
}
a[j+1]=temp;
}
}
}