数组的应用方式
排序的目的,在于方便进行查找,针对不同情况,选择对应的排序算法,往往能事半功倍。
逆序
给定一个数组 (准备10个数据) 对数组进行逆序
// 0 1 2 3 4 5 6 7 8 9 //下标
int a[]={1,2,3,4,5,6,7,8,9,10};//数值
//10,9,8,7,6,5,4,3,2,1
所谓逆序:
对应位置上值交换一下
0号位置 9号位置 //下标相加 为 9 // len - 1
1号位置 8号位置
2号位置 7号位置
3号位置 6号位置
4号位置 5号位置
a[i] <=> a[9-i];
int i;
int temp;
temp = a[i];
a[i] = a[9-i];
a[9-i] = temp;
这是整型逆序的方法,如果是字符串逆序 又该如何做呢?
提示:strcpy();
选择排序
思想:给对应的位置选择合适的数
顾名思义,选择排序就是通过遍历数组,从中选择出数组的最小或最大值,同时与指定位置交换数据,遍历完整个数组的所有位置就可以完成排序
for (j = 0; j < n - 1; ++j) // 确定位置
{
//找最小值,将a[j]当作最小值的位置
for (i = j + 1; i < n; ++i) //找到合适的数
{
if (a[i] < a[j])
{
t = a[i]; //交换
a[i] = a[j];
a[j] = t;
}
}
}
冒泡排序
思想:相邻两个元素,两两比较,小的放前,大的放后
for (j = 0; j < n-1; ++j) //遍历数组
{
for (i = 0; i < n - j-1; ++i) // 比较相邻元素后升序
{
if (a[i] > a[i+1])
{
t = a[i]; //交换
a[i] = a[i+1];
a[i+1] = t;
}
}
}
插入排序
思想: 将一个数,插入到一个有序的序列中。注意是有序的序列中
难点在于如何找到合适的位置?
选择一个位置,将插入的位置标记为key,和位置所在后面的数据比较大小,小则降序,大则移动插入的位置
实现步骤:
1.拿一个要插入的值
2.寻找最终要插入的位置
3.找到后插入数据
//原地插入
for (i = 1; i < n; ++i) //1.控制拿数据
{
int key = a[i]; //拿数据
j = i;
while (j > 0 && a[j-1] > key) //2.找位置
{
a[j] = a[j-1];
--j;
}
a[j] = key; //3.插入数据
}
二分查找
前提:
查找的数据 一定是有序的。查找的数量只能是一个。
思路:
1.找一个中间位置 mid (实际是数组中间位置的下标 )
判断中间位置上的值 与 要查找的值的大小关系
a[mid] > n
2.a[mid] > n
缩小区间 ,到前面小的一部分继续 二分查找
3.a[mid] < n
缩小区间, 到后面大的一部分继续 二分查找
4.a[mid] == n
直接表示找到了
代码
int n; //假设要查找的是n
int begin = 0;
int end = len-1;
int mid;
while(begin<=end)
{
mid = (len-1+begin)/2 //产生一个中间位置的下标
if(a[mid]>n)
{
end = mid-1;
}else if(a[mid]<n)
{
begin = mid +1;
}else
{
break;
}
}
if(begin<=end)
{
printf("found\n");
}else
{
printf("no found\n");
}
上述都是整型数组的排序算法,针对字符串数组来说,思路都是一样的,区别在于字符串能用strcpy,strcmp这两个函数更方便的进行比较和交换。
算法排序在c语言中有着至关重要的作用,万丈高楼平地起,要实现各种复杂的功能,少不了算法排序。网上关于算法排序有很多优秀的讲解,看到有思路不错的,可以私信推荐给笔者,一起交流学习,共同进步。