上次我们已经认识了一维数组,那今天就学习一下基于一维数组的排序和查找吧!
选择排序:
思想:
给合适的位置选择合适的数
int i,j,temp;
int a[10];
int len = sizeof(a)/sizeof(a[0]);//求数组元素个数
printf("请输入十个数:");
for(i = 0;i < len;++i)
{
scanf("%d",&a[i]);
}
for(i = 0;i < len - 1;++i)//数组下标最大为元素个数-1,len-1
{
for(j = i+1;j < len;++j)
{
if(a[j] < a[i])
{
temp = a[j];
a[j] = a[i];
a[i] = temp; //交换a[i]a[j]的值
}
}
}
for(i = 0;i < len;++i)
{
printf("a[%d] = %d\n",i,a[i]);
}
return 0;
要确定的位置a[i],为这个位置选择合适的数,依次与a[i]之后的数进行比较,如果碰到比a[i]还小的数,则交换他们确保a[i]是它及它之后所有数的最小值。
确定好之后i自增,开始为下一个位置
寻找合适的数,重复上述操作确定好之后i自增,开始为下一个位置
寻找合适的数,重复上述操作
冒泡排序:
思想:
一次冒出一个数
相邻两个元素,两两比较,小的放前,大的放后
代码:
int i,j,temp;
int a[8];
int len = sizeof(a)/sizeof(a[0]);
for(i = 0;i < 8;++i)
{
scanf("%d",&a[i]);
}
for(i = 1;i < len;++i)
{
for(j = 0;j < len-i;++j)
{
if(a[j] >a[j+1])
{
temp = a[j+1];
a[j+1] = a[j];
a[j] = temp;
}
}
}
for(i = 0;i < len;++i)
{
printf("%d\n",a[i]);
}
控制好趟数后,从第一位开始往后比较,使a[j+1]始终为最大值,最后使a[j+1]冒泡到最后一位然后进行下一趟冒泡,下一趟冒泡的比较次数比前一趟减少一次
每一趟选出剩余所有数的最大值,冒泡到最后一位
插入排序
思想:
在有序序列中,找到合适的位置插入
代码(其中注释掉的部分借助了b数组进行插入,目的是便于理解,后面的为原地插入称为插入排序)
int a[]={8,7,9,6,3,1,88};
int len = sizeof(a)/sizeof(a[0]);
int b[len];
int i,j,t;
#if 0
for(i = 0;i < len;++i)
{
t = a[i];
j = i;
while(j > 0 && t < b[j-1])
{
b[j] = b[j-1];
--j;
}
b[j] = t;
}
for(i = 0;i < len;++i)
{
printf("%d\n",b[i]);
}
#endif
for(i = 1;i < len;++i)
{
t = a[i];
j = i;
while(j > 0 && t < a[j-1])
{
a[j] = a[j-1];
--j;
}
a[j] = t;
}
for(i = 0;i < len;++i)
printf("%d\n",a[i]);
在有序序列中找到合适的位置插入
从第二位开始与第一位进行比较,先将这个数固定如果比第一位小则将第一位的值赋给第二位,固定的值赋给第一位,这个第二位数就找到了自己合适的位置插了进去
然后第三位数开始插入,固定过后开始与第二位进行比较如果比第二位小,则将第二位的值赋给第三位,然后与第一位进行比较如果比第一位小则将第一位的值赋给第二位,固定的值赋给第一位,(如果比第一位大则将则将第三位固定的值赋给第二位)这个第三位数就找到了自己合适的位置插了进去
查找算法
二分查找(折半查找)
大前提:
数据得是有序的
思想:
1. 找到中间位置的数, //下标
2. 拿这个数 和 要找的数比较
代码
int m;
scanf("%d",&m);
i = 0;
j = len - 1;
int mid;
while(i <= j)
{
mid = (i + j)/2;
if(b[mid] > m)
{
j = mid - 1;
}else if(b[mid] < m)
{
i = mid + 1;
}else
{
break;
}
}
if(i <= j)
{
printf("找到了");
}else
{
printf("没找到");
}
首先找到begin=0和end=len-1的值,循环始终满足begin<end,
找到中间位置的数的下标mid=(begin+end)/2;将a[mid]与要查找的数m,进行比较,
如果a[mid]>m,则end=mid-1,如果a[mid]<m,则begin=mid+1(假定数组升序),
都不满足则跳出循环。不断循环直到找到跳出循环,或未查找到不在满足循环条件结束