选择排序
思维逻辑:顺序的选择一个位置上的数,逐个地与后面进行对比,如果比后面的数大则交换位置,继续用1号为的新数和后面的进行对比。可以理解为:(比武招亲),擂台上永远一直站着一个被挑战的人。
那么如何用代码实现这一功能呢?
for(i = 0; i < len; ++i)
{
for(j = i+1; j<len; ++j)
{
if(a[i]>a[j])
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
冒泡排序
冒泡排序法形象的表示为冒出一个个大的泡泡。冒泡排序法的算法思想是:相邻的两个数两两比较,大的放在放在后面小的放在前面,这样每一趟的循环会冒出一个最大数,那么下一次循环就可以较小一次比较的次数。代码编写如下:
for (i=1; i<len; ++i)
{
for(j=0; j<len-i; ++j)
{
if(a[j]>a[j+1])
{
交换这两个数
}
}
}
在冒泡排序法中外层for表示总共循环的趟数n-1;内层for则表示为两两对比的过程。
插入排序
int i , j , tmp;
for(i = 0; i < len ; ++i) //依次拿数
{
tmp = a[i]; //记录拿出的数的下标和数值
j = i;
while(j > 0 && a[j -1] > tmp) //从前一项开始依次比较
{
a[j] = a[j - 1]; //往后挪一位为插入的数做准备
--j;
}
a[j] = tmp; //找到位置之后赋值
}
二分查找
二分查找的逻辑原理是使用找中间的逻辑,通过对比中间值,然后确定往前寻找还是往后寻找,这是一种高效的寻找方式。
int n;
while(begin <= end)
{
if(a[mid]>n)
{
end = mid-1;
}else if(a[mid]<n)
{
begin = mid +1
}else
{
a[mid] = n;
break;
}
if(begin <= end)
{
有数;
}else
{
没有该数
}
}
#include<stdio.h>
int main()
{
int n;
int i,j,tmp;
printf("please input n as:\n");
scanf("%d",&n);
int a[n];
int begin,end,mid,Num;
printf("input n Num:\n");
for (i = 0; i<n; ++i)
{
scanf("%d",&a[i]);
}
for (i=1; i<n; ++i) //冒泡排序
{
for(j=0; j<n-i; ++j)
{
if (a[j]>a[j+1])
{
tmp = a[j];
a[j] = a[j+1];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
}
for(i = 0; i<n; ++i)
{
printf("%d ",a[i]);
}
putchar('\n');
printf("input Num you want find\n");
scanf("%d",&Num);
begin = 0;
end = n - 1;
while(begin <= end) //二分查找
{
mid = (begin + end) / 2;
if (a[mid]>Num)
{
end = mid - 1;
}else if(a[mid] < Num)
{
begin = mid +1;
}else
{
break;
}
}
if (begin <= end)
{
printf("Num=%d is found\n",Num);
}else
{
printf("no the Num");
}
return 0;
}
字符型数组:
其本质是使用字符存储,通过顺序的存储达到字符串的存储效果。在字符串的存储中其末尾存在结束标志\0。程序通过识别\0的位置可以确定数组中字符串存在的具体位置和空间。
字符串在输出和输出时有特定的函数:gets(s)、puts(s)