一.选择排序
部分核心代码
for (i = 0; i < len-1; ++i) //控制位置
{
for (j = i + 1; j < len; ++j)//找数
{
if (a[j] < a[i])
{
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
数组是a[i],len是数组长度;
用数组a[1,3,2,5,4]作为例子,当i=0时,a[i]=a[0]=1和后面的4个数比较,即循环a[j];当遇到比a[i]小的数时,就做数值交换;当i=4,即a[i]=a[4]=5时,a[i]就和最后一位数a[j]进行最后的比较,所以i的范围是i<len-1,j<len
二.插入排序
1.非原地插入排序
int b[len];
for (i = 0; i < len; ++i)
{
int t = a[i];
j = i;
while(j > 0 && t < b[j-1])
{
b[j] = b[j-1];
--j;
}
b[j] = t;
}
用数组a[1,3,2,5,4]作为例子,b[ ]为空数组,用t来作为交换值。当i=0时,不满足while(j>0)的条件,直接将a[0]记入数组b[0]。当i=1时,t=a[i]=a[1],用t=a[1]来和前1位的数b[j-1]=b[0]做比较,把大的数记录在b[j],t=a[i]继续和前面的数比较,直到与第一个完成比较即j=0时,退出while循环,b[j]即循环结束时的位置b[j]=t
2.原地插入
思想:
在有序序列中,找到合适的位置插入
for (i = 1; i < len; ++i)
{
int t = a[i];
j = i;
while(j > 0 && t < a[j-1])
{
a[j] = a[j-1];
--j;
}
a[j] = t;
}
三、 二分查找
思想:
1. 找到中间位置的数, //下标
2. 拿这个数 和 要找的数比较
mid 是数组下标
a[mid] > m
a[mid] < m
3. 每次折一半,直到找到对应数组,或者 结束
前提:数据得是有序的
部分核心代码:
int begin,mid,end;
begin = 0;
end = len-1;
while (begin <= end)
{
mid = (begin+end)/2;
if (a[mid] > m)
{
end = mid - 1;
}else if (a[mid] < m)
{
begin = mid + 1;
}else
{
break;
}
}
if (begin <= end)
{
printf("found!\n");
}else
{
printf("not found!\n");
}
首先定义数组的开始begin=0,数组的末尾end=len-1,从键盘输入一个数m
当while (begin <= end),mid=(begin+end)/2,此时的中间值就是a[mid]。当a[mid]>m说明m在该数组的前半段,用end=mid-1表示前半段的一半,取前半段的一半和m进行比较,直到a[mid]=m或end<begin时,用break将整个while停止;
最后的if (begin <= end),else{}表示:while如果提前结束就说明找到了,没提前结束一直到begin>end就说明没找到;
四.冒泡排序
思想:
一次冒出一个数
相邻两个元素,两两比较,小的放前,大的放后
for (i = len-1; i > 0; --i)
{
for(j = 0; j < i; ++j)
{
if (a[j] > a[j+1])
{
int t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
分析:例如数组a[1,3,2,6,5];len=5
i从i=4开始循环,a[j] > a[j+1],如果第一个比第二个大(升序排序中),就交换它们两个。
从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。然后i循环即i=3,本次循环结束时,倒数第二个数会是第二大的数。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
五.一维字符型数组
一维字符型数组 --- 放字符串
1.字符串 是 当做字符数组来处理的。
2.字符串 有一个专门的结束标志 '\0'
3.处理的是字符串,操作的时候,往往以 结束标志 为 操作依据
4.处理的是数组,操作的时候,往往以 数组长度 作为操作依据
5.字符数组可以用来存储字符串
而字符串在内存中存储的方式 也是以 字符数组形式存储的
字符串:char s[ ]="hello"
实际占用的内存空间,是'h''e''l''l''o''\0' 包含了'\0'
int puts(const char *s);
功能:输出一个字符串
参数:
s //表示字符串 -- 指针类型
//字符数组名 s
//字符串常量 "hello"
返回值:
成功 非负数
失败 -1
注意:puts输出时 自动会加 换行
使用gets(),容易越界,占用别的空间,属于危险操作。