黑马程序员_C语言基础_数组之冒泡排序、快速选择排序、折半查找

时间:2021-05-21 00:26:10

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------  

    学习一维数组和二维数组的差别不大,学习方法可以通用,在学习过程中可以比较学习,找出他们的异同,那这样学习效率和学习效果会有明显的提升。

1、数组的格式

      一维数组:数组类型    数组名[数组长度]  

      二维数组:数组类型    数组名[常量表达式1][常量表达式1]

注意事项:

A数组长度可以是常量,可以常量表达式,不可是变量(不过在xcode中可以适用,对它已经做了优化)

B数组名不能与其他变量重名

C数组长度可以使用宏定义,在头部引用#define  m 6

D允许在定义数组的时候,还可以定义其他的变量,eg:int x,y,a[3];

2、初始化

A定义的同时完全初始化

int a[4]={1,2,3,4};  int a[]={1,2,3,4};  可以省略数组长度

B定义的同时部分初始化

int a[10]={1,2,3,4}; 那么其他的元素系统默认为0

C先定义然后再初始化

int a[3];

a[0]=1;a[1]=2;a[3]=4;

3、数组存储(重点掌握)

A数组名代表了数组的首地址

B先定义的数组分配在高地址上

C数组各元素的地址不一定连续

D数组名代表了数组的首地址,相当于数组第一个元素的地址

在考虑这一块的时候可以结合画图形的方式来记,这样就简单明了许多。

4、数组名作为函数参数(掌握)

A数组可以进行参数传递,要看清楚形参实参传递过程

B用数组名作为函数传递时,传递的是首地址;数组元素作为函数传递时,传递的是值

C变量作为函数传递时,只能是单向传递的

D形参与实参的类型与长度要一致,否则会出现不一样的结果

E在传递过程中,形参的长度可以省略不写

    知识点大体就是这些,要好好掌握它们需要不断的对它们进行应用,最常用的就是对数组进行排序查找。这儿介绍比较经典的冒泡排序、快速排序、折半查找的思想及实现。

    主要思想都是利用for双重循环,外层控制比较的次数,内层控制的是数值比较。

5、冒泡排序

思想:冒泡排序的思想可以简化一句话:大数下沉,小数上浮。

    主要是一个无序的数组,先从第一个数组元素与第二个元素进行比较,若第一个数组元素大于第二个元素,那第二个元素往后放,依次类推,就是相邻两个元素比较,大数就把它放在后面,小数放在前面,直至走访完整个数列没有在需要交换的。

void maopao(int a[],int len)
{
int t;//定义变量进行值交换
//双重循环
for (int i = 0; i < len - 1;i++)
for (int j = 0; j < len - 1 - i; j++)
{
//进行判断,实现大数向下,小数向上
if (a[j]>a[j+1])
{
//利用中间变量实现值交换
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}

int main(int argc, char *argv[])
{
//定义一个数组
int a[8] = {39,45,10,58,9,42,5,2};
maopao(a, 8);//把数已经排序完
printf("%d ", a);
return 0;
}

6、选择排序

思想:选择排序的思想可以简化一句话:每次找到小数放在前面。

    主要是一个无序的数组,就从所有序列中先找到最小的,然后放到起始位置。之后再看剩余未排序元素中查找最小的,放到第二个位置……以此类推,就可以完成整个的排序工作了。

void xuanze(int a[], int len)
{
int t;//定义变量进行值交换
//双重循环
for (int i = 0; i < len - 1; i++)
for (int j = i+1; j < len ; j++)
{
//进行判断,实现大数向下,小数向上
if (a[i]>a[j])
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}

int main(int argc, char *argv[])
{
//定义一个数组
int a[8] = {39,45,10,58,9,42,5,2};
xuanze(a, 8);//把数已经排序完
printf("%d ", a);
return 0;
}

6、折半查找

思想:折半查找适用于有序的数组

在有序表中,把待查找数据值key与查找范围的中间元素mid值进行比较,会出现三种情况

A 待查找数据值比中间元素值小,则以整个查找范围的前半部分作为新的查找范围,执行C,直到找到相等的值。

B待查找数据值比中间元素值大,则以整个查找范围的后半部分作为新的查找范围,执行C,直到找到相等的值

C待查找数据值与中间元素值正好相等,则返回中间元素值的索引,查找结束。

D 如果最后找不到相等的值,则返回错误提示信息。

int zheban(int a[], int len,int key){
//先定义变量
int low = 0, high = len - 1, mid;
//循环
while (low <= high)
{
//计算mid是位置
mid = (low+high)/2;
//key>a[mid] low=mid+1; key<a[mid] high=mid-1; key>a[mid] return mid;
if (key > a[mid])
{
low = mid + 1;
  }
else if (key<a[mid])
{
high = mid - 1;
}
else
{
return mid;
}

}
return -1;
}

int main(int argc, char *argv[])
{
//定义一个有序数组
int a[8] = { 3, 4, 10, 58, 69, 78, 85, 92 };
int s = zheban(a, 8, 10);//把数已经排序完
printf("%d ", a);
return 0;
}

总结:在应用中学会的是思想,不仅仅是代码,思想比实现更为重要。


------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------