排序:
排序 --- 按照一定顺序排列
(1).从小到大 --- 升序
(2).从大到小 --- 降序
排序方法:
选择排序
冒泡排序
插入排序
快速排序
选择排序:
核心代码:
for (i = 0; i < n-1; ++i) //控制位置
{
for (j = i + 1; j < n; ++j) //找数
{
if (a[j] < a[i])
{
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
思路:
1.将第一个位置数与后面的数一一比较。//代码第一个位置对应a[i],其中i = 0。
2.若发现后面某个数比第一个位置的数小,两个数则交换位置。//if中的三个语句
3.较小的数放在第一个位置后,不从头开始,继续刚才的位置向后比较直到结束
解释:i的取值范围是[0,n-2],j的取值范围为[i+1,n-1],这是因为在程序中我们
是最后将a[n-2]与a[n-1],也就是i取最大值时的a[i]与j取最大值的a[j]比较。
当i取到n-2时,a[n-2]就可以与a[n-1]比较,也就是完成了所有数的比较。
4.当i=0取完时,此时,a[0]中存放的是数组的最小值。然后i取1,重复上述步骤,便
可从小到大排列。至于j取最小值取i+1的原因是因为我们只要与i的后面的数比较,
不要与i前面的数比较。所以j一开始的取值就比i大1。
冒泡排序:
核心代码:
for (i = n-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;
}
}
}
思路:
1.从第一个数开始,即a[j],j = 0,若a[j]比后面的一个数a[j+1]大,两个就交换位置,
否则,j就加1。也就是一开始a[0]与a[1]比较,若a[0]小于a[1],则进行a[1]与a[2]比
较。
2.若a[1]>a[2]这将两个数交换位置,再进行a[2]与a[3]的比较。
注意:此时,a[2]里的值为之前a[1]的值,a[1]的值为之前a[2]的值。
3.上述操作可将数组中最大的值放进a[n-1]也就是数组最后一个值。
4.重复上述操作便可将数组从小到大排列又因为我们每次循环i的值都会减一,所以我们
每次循环就不会操作到后面完成比较的值
原地插入排序 :
核心代码:
for (i = 1; i < n; ++i)
{
int t = a[i];
j = i;
while(j > 0 && t < a[j-1])
{
a[j] = a[j-1];
--j;
}
a[j] = t;
}
思路:
1.将第i个数,a[i]与前面的数一一比较若a[i]>a[j],则记录j的位置并a[j-1]与其后面的数( 不 包括a[i])全向后移一位,然后将a[i]放到之前a[j]的位置。
2.因为i是逐渐变大的,所以a[i]前面的数是按照从小到大排好的,之后我们只需要将后面的 数依次向前面摆,大的数逐渐后移便可以实现将所有数从小到大排列。
查找算法:
二分查找(折半查找)
大前提:
数据得是有序的(下代码是从小到大)
核心代码:
while(begin <= end)
{
if(a[mid] > n)
{
end = mid - 1;
mid = (begin + end) / 2;
}
else if(a[mid] < n)
{
begin = mid + 1;
mid = (begin + end) / 2;
}
else
{
printf("a[%d] = %d",mid,n);
break;
}
}
思路:
1.说明:begin初值为0,end初值为n-1,mid初值为(begin + end)/ 2,n为要找的值
2.在循环里面如果a[mid]也就是中间比要找的值n大,故n应该在a[mid]前面,此时将end变 为mid -1,再求新的mid,再比较。为什么取mid - 1 而不是mid呢,因为如果数组中没有 这个值的话最终,mid begin end三个值会想等,就无法退出循环。
3.如果最后end > begin就意味着数组里面没有对应的值
一维字符型数组:
数据类型 数组名[数组长度];
int a [10];
char s [20]; //一维字符型数组
从数组角度:
char s[20] = {'a','b','c','d'};
数组 用来 存储数据的
一维字符型数组 --- 放字符串
"hello" //字符串
//字符串的角度
char s[20] = {"hello"};
"hello" //数组的特点
1.字符串 是 当做字符数组来处理的。
2.字符串 有一个专门的结束标志 '\0'
3.处理的是字符串,操作的时候,往往以 结束标志 为 操作依据
4.处理的是数组,操作的时候,往往以 数组长度 作为操作依据
5.字符数组可以用来存储字符串
而字符串在内存中存储的方式 也是以字符数组形式存储的
"hello" --- 'h''e''l''l''o''\0'
实际占用的内存空间,是包含了'\0'
"" //字符串 --- 空字符串 '\0'
int puts(const char *s);
功能:
输出一个字符串
参数:
s //表示字符串 -- 指针类型
//字符数组名 s
//字符串常量 "hello"
返回值:
成功 非负数
失败 -1
注意:
puts输出时 自动会加 换行
gets
char *gets(char *s);
功能:
从键盘获得一个字符串
参数:
s //代表就是一块存储空间 --- 需要的是一个一维字符型数组的数组名
返回值:
成功 s
失败 NULL