C语言数组及排序算法

本文介绍了C语言中数组的特性、下标使用注意事项,以及选择排序、冒泡排序和插入排序的基本概念和实现。通过实例展示了如何在给定数组中找出最大值和次大值。
摘要由CSDN通过智能技术生成

数组

类型说明符 数组名[ 常量表达式 ];

例  float s[100];  定义了一个浮点型数组 数组名为 s ,此数组有100个元素

[ ]括号内常量表达式应为非0无符号整形表达式

a[10]创造出的10个元素为a[0]-a[9]且元素类型与定义a[10]相同

数组存储具有1.单一性 2.有序性 3.连续性

数组存储方式是以首元素地址为相对地址 通过下标计算偏移量 进行偏移。                               

注意事项:1.使用数组时 下标不能超过定义数组的数。如果超过将会发生越界访问,造成严重大错误。  

                2.数组不能整体被引用,也不能被整体打印。

                3.数组的数组名为数组的首元素地址。

                4.定义的[]不是下标运算符,是类型说明符

可以使用{}来进行初始化

如果{}内没有全部初始化,剩下的数组元素全部补0。

如果初始化数组元素个数 小于 定义数组元素个数 否则将会程序报错 越界

可以使用int a[] = {1,2,3,4,5,6,7,8,9,0}来定义整形a数组,数组元素个数为大括号内赋值的个数。

可以用 sizeof(a) / sizeof(a[0]) 来计算数组内元素个数。

排序算法

1.选择排序

指在合适的位置上放上合适的数。

选择排序是循环里嵌套了一个循环,一共是两个循环,里面的循环有一个选择语句。

以i = 0 为例 里面的循环是将a[0]的值分别与a[1]~a[4]进行比较,如果a[0]的值大于a[1]~a[4]则将a[0]的值与之交换,一轮循环下来,a[0]里的值将会为最小值。

而外层循环是将a[0]跑完一轮内层循环后将a[0]递增1变为a[1],a[1]在进行内层循环,这样a[1]的值会为除a[0]外的最小值及次小值,外层循环一直到a[3]。两层循环跑完这样就从a[0]开始进行从小到大的排序。

选择循环的算法复杂度为 o(n)=n*n

2.冒泡排序

是将数组中相邻的两个元素两两比较,小的放前,大的放后。

冒泡排序也是两个循环,外层循环  j  从 len(函数长度) -1 即4开始,依次减1 直到等于0

内层循环 i 是从 0 开始 依次加 1 直到等于 j

例 从 j  = 4 (len - 1)开始 i = 0 将 a[i]依次与a[i+1]进行比较如果a[i] > a[i+1]则将 a[i]与a[i+1]的值进行对换,这样一轮下来,i从0到j=4,a[4]里将会装的是这个数组的最大值。

第二轮i还是从0开始,j的值减1,i从0到3 到a[3]结束,内层循环结束a[3]里将会装次大值即第二大的数。外层循环结束,这个数组将会从a[4]开始向左,由大到小进行排序。

3.插入法排序

列如抽扑克牌一般,每抽到手里一张牌就对该牌从右到左,从大到小排序,放在合适的位置。

创立一个新数组b[ ] b数组的长度与 a[]相同, 将a[0] 放入 b[0] 接下来有两个循环

例 i = 1 开始 ,将a[1]的值赋给t,然后令j=i,如果 b[0] 的值大于 t=a[1] 则令 b[1] = b[0] 令 j 减1(即j坐标左移),当不满足while条件时,将 t 的值赋给 B[ j ]  。 即 j = 0 内层循环条件为假跳出循环,令b[0]=a[1]。外层循环一次,t = a[2] 如果 a[1] > a[2]则令a[2] = a[1],j减1 ,j为1 ,再进行判断a[0]是否大于 a[2]如果 a[0]>a[2] 则令a[1]=a[0] j再减1为0 跳出循环令 a[0]=a[2]。相当于是i从1开始将i = j ; a[ j ]与分别与a[ j-1 ]进行比较如果a[ j-1 ]的值大于a[ i ]则a[ j ]值= a[j-1]  j 减1 直到 a[ j-1 ]<a[ j ] 或 j = 0 为止,则令a [ j ] = a[ i ]

这样a[ i ]从左边开始始终放在比左边大比右边小的位置。

原地插入法:不需要创造数组b,就在a数组中开始比较,从a[0]开始,依次比较到a[len -1]。

二分查找法

原数组必须是有序数组

令数组第一个下标为 begin 最后一个下标为 end

mid = (begin + end) / 2。

将要查找的值a[n] 与 a[mid] 进行比较,如果 a[mid] >a[ n ] 则n在 mid 的左边 将 end下标更新为 原来的mid-1

如果 mid < n 则n在mid的右边 将end下标更新为 原来的mid+1

重新计算mid再次跟n比较直到begin <= end 位置   通过检测循环条件 begin <= end 是否为真来判断是否查找到n。

代码练习

定义一个数组a = {1,2,3,4,5,6,7,8,9,0}求出数组的最大值和次大值,并打印出最大值和次大值。

  1 #include<stdio.h>
  2
  3 int main(int argc, const char *argv[])
  4 {
  5     int a[] = {1,2,3,4,5,6,7,8,9,0};
  6     int max = a[0], i = 1;
  7     int len = sizeof(a) / sizeof(a[0]);
  8 
  9     for(i; i < len; ++i)
 10     {
 11         if(max < a[i])
 12         {
 13             max = a[i];
 14         }
 15     }
 16     printf("max = %d\n",max);                                                                                                                                  
 17     int second = 0x80000000;
 18     for(i = 0; i < len; ++i)
 19     {
 20         if(second < a[i] && a[i] < max)
 21         {
 22             second = a[i];
 23         }
 24     }
 25     printf("second = %d\n",second);
 26 
 27     return 0;
 28 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值