目录
排序
选择排序
算法思想:给合适的位置选择合适的数。
实现过程:(升序为例)有n个数,我们先选第一个数为基准,从第二个数开始,先跟第一个数比较,如果第一个数大于第二个数,则两个数交换,如果没有,则用第三个数跟三个数跟它比较,重复上面的过程,当最后一个数跟它比完,则第一个数就是所有数中最小的数,然后将基准放在第二个数,还是用它的后一个数开始重复第一次的过程,知道倒数第二数,直接跟最后一个数比较,整个过程结束,排序完成。
代码实现:
//len为数组长度
//外层循环控制当前的位置
for (i = 0;i < len -1;i++)
{
//内层循环控制第几个数跟当前位置的数比较
for (j = j + 1;j < len;j++)
{
if (a[j] < a[i])
{
int temp = a[j+1];
a[j+1] = a[i];
a[i] = temp;
}
}
}
流程图:
冒泡排序
算法思想:(升序为例)一次冒出一个数,相邻两个数两两比较,小的放前面,大的放后面。
实现过程:第一次冒泡时,从第一个数开始,跟第二个数比较 ,如果第一个数大于第二个数,则两个数交换位置,前两个比的时候,大的数跑到了第二个位置,接着将第二个位置的数跟第三个数比较,也是小的在前,大的在后,知道倒数第二个数,跟最后一个位置的数比较,顺序正确,数不变,顺序不对换位置,然后,第一次冒泡完成,最后一个数一定是最大的,然后开始第二次冒泡,只是最后一个数被排除在外了,经过n-1次冒泡,排序完成。
代码实现:
//len为数组长度
//外层循环控制冒泡的次数,共len-1次
for (i = 0;i < len -1;i++)
{
//内层循环控制是否要将两两相邻的数交换
for (j = 0;j < len-1-i;j++)
{
if(a[j+1] > a[j])
{
int temp = a[j+1];
a[j+1] = a[j];
a[j] = temp;
}
}
}
流程图:
插入排序
算法思想:在有序的序列中找到合适的位置插入
实现过程:(升序)一组数排序时,第一个数不变,第二个数跟第一个数比较时,只有两种结果,如果比第一个数大,放右边;如果比一个数小,那么刚才想插入的位置上就要更新为第一个数的值,将第一个数的位置空出来,将第二个数插入到第一个位置去。 该算法,主要是要理解,某个数要插入的位置是它本来想呆的位置,只是如果它比前一个数还小,它就得依次去找到它能呆的位置,它有两种可能停下它找位置的脚步,要么它找到第一个位置了,不能再往前找了,那它就是最小的,或者它找到前面已经拍好的数之间它比某一个数大,那他就挨着它的右边放。经过n次插入,整组数排序完成
代码:
//非原地插入
//外层循环控制第几个插入的数字
for (i = 0;i < len;i++)
{
//内层循环是找到合适的位置,依次与前一个比,如果找到开头或者找到一个比它小的数就停止
j = i;
while (j > 0 && a[i] < b[j-1])
{
b[j] = b[j-1];
j--;
}
b[j] = a[i];
}
//原地插入
for (i = 0;i < len;i++)
{
int temp = a[i];
j = i;
while (j > 0 && temp < a[j-1])
{
a[j] = a[j-1];
j--;
}
a[j] = temp;
}
流程图:
查找
二分查找
算法思想:在有序(升序为例)的数列中,找到中间值与要查找的值进行比较,如果大于要查找的值,则往前半区找,反之找后半区,每次都先找到中间值,与要查找的值比较。直到找到或者超出边界(找不到)。
代码:
int begin,end,mid;
int num;
begin = 0;
end = len - 1;
scanf("%d",&num);
while (begin <= end)
{
//找到中间位置的下标
mid = (begin + end) / 2;
//分区,如果中间值大于num,找前半区,将end移到mid的前一位
if (a[mid] > num)
{
end = mid - 1;
}
//如果中间值小于num,找后半区,将begin移到mid的后一位
else if (a[mid] < num)
{
begin = mid + 1;
}
//找到,退出循环
else
{
break;
}
}
if (begin <= end)
{
printf("found\n");
}
else
{
printf("not found\n");
}
流程图: