交换算法:交换两个变量的值
int a=1,b=2;
a+=b; //a,b的和不能超过a的存储空间
b=a-b;
a=a-b;
监哨值法求最值
int buf[10]={1,2,3,4,5,6,7,8,9,0};
int i=0,listen=0;
for(i=1;i<10;i++)//数组的第一个值给了listen,从第二个值开始比较
if(buf[listen]>buf[i]);
listen=i;
printf("min=%d\n",buf[listen]);
排序
1.冒泡排序法
在每次大循环内比较相邻两个值的大小,使较大值向右移动。
int buf[10]={2,4,6,8,1,3,5,7,9,0};
int i,j;
for(i=0;i<9;i++)//最后一个数不用排
for(j=0;j<9-i;j++)//已排完的数不用再比较
{
if(buf[j]>buf[j+1])
{
buf[j]+=buf[j+1];
buf[j+1]=buf[j]-buf[j+1];
buf[j]-=buf[j+1];
}
}
for(i=0;i<10;i++)
printf("%d ",buf[i]);
printf("\n");
2.冒泡-改---插入排序法
每次从未排序队列中取出第一个值与它前面的值比较,如果取到的值比它前面的值要小就将它前面的值向后移,如此循环。直到前值不小于它,然后填入空位中
int buf[]={1,3,5,7,9,2,4,6,8,0};
int i,j,temp;
for(i=1;i<10;i++) //从未排序队列中取第一个值. 注:第一个值默认在已排队列中
{
j=i;
temp=buf[i]; //将取到的值另存起来,否则移位时会被覆盖
if(j>0 && temp<buf[j-1])
{
buf[j]=buf[j-1]; //比temp大的值后移
j--;
}
buf[j]=temp; //把temp填入正确位置
}
for(i=0;i<10;i++)
printf("%d",buf[i]);
printf("\n");
3.选择排序法
每次从未排序队列中找出最小值与为排序队列的第一个值交换。
int buf[]={1,3,5,7,9,2,4,6,8,0};
int i,j;
for(i=0;i<9;i++) //未排序队列从i开始,最后剩下的一位不用排
{
int min=i;
for(j=i+1;j<10;j++)//监哨值法找最值
if(buf[min]>buf[j])
min=j;
//交换
if(i!=min) //位置不正确才交换
{
buf[i]+=buf[min];
buf[min]=buf[i]-buf[min];
buf[i]-=buf[min];
}
}
for(j=0;j<10;j++)
printf("%d",buf[j]);
printf("\n");