黑马程序员——C语言之选择排序、折半查找法与二维数组
2015-07-06 09:18
471 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
19.选择排序
for (int i = 0;
i<len-1; i++) {
for (int j = i+1;
j<len; j++) {
if (a[j]<a[i]) {
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
for (int k = 0;
k < len; k++) {
printf("%d ",a[k]);
}
printf("\n");
}
printf("\n");
}
20.折半查找法
①基本思路:在有序表中,取中间元素作为比较对象,若给定值与中间元素的要查找的数相等,则查找成功;若给定值小于中间元素的要查找的数,则在中间元素的左半区继续查找; 若给定值大于中间元素的要查找的数,则在中间元素的右半区继续查找。不断重复上诉查找过程,直到查找成功。
#include <stdio.h>
int find(int a[],int num,int len){
int low=0,mid=0,high=0,key=0;
int flag = 1;
printf("len is %d\n",len);
low = 0,high = len-1;
while(flag){
mid = (low+high)/2;
if (a[mid] < num) {
low = mid;
}
if (a[mid] > num) {
high = mid;
}
if (a[mid] == num) {
key = mid;
flag = 0;
}
}
return key;
}
int main(int argc, const char *
argv[]) {
int a[] = {12,23,34,42,56,63,72,89,94};
int len = sizeof(a) / sizeof(int);
int num = 23;
int key = find(a, num,len);
printf("the key number is %d,key is %d\n",num,key);
return 0;
}
21.二维数组
①一个一维数组的每个元素又被声明为一个一维数组,从而构成二维数组,可以说是二维数组是一个特殊的一维数组。
②定义: 数组名[第一维的长度(行)] [第二维的长度(列)]; int a[2][3]; int b[1+3][3} ; #difine M 3 int c[M][M+3]。
③初始化:
1)完全初始化:
正常赋值:int a[2][3] = {{1,2,3},{2,3,4}};
连续赋值:int a[2][3] = {1,2,3,4,5,6};
可以省略第一维:int a[][3] = {{1,2,3},{4,5,6},{7,8,9}}; //等价于int a[3][3];
int a[][2] = {1,2,3,4,5,6,7,8}; //等价于int a[4][2]={1,2,3,4,5,6,7,8};
2)部分初始化:
int a[3][4]= {1}; //a[0][0]被赋值为1,其他全为0;
④存储方式:
1)计算机会给二维数组分配一块连续的存储空间;
2)数组名代表数组的首地址,从首地址开始,依次存入第一行、第二行....第n行;
3)每一行的存储方式,从行首地址开始,依次存储行的第1个元素、第2个元素...第n个元素;
4)每个元素占用相同的字节数(取决于数组类型);
5)并且数组中元素之间的地址是连续的;
6)首地址 = 数组名地址 = 第一行的地址 = 第一行第一个元素地址
19.选择排序
for (int i = 0;
i<len-1; i++) {
for (int j = i+1;
j<len; j++) {
if (a[j]<a[i]) {
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
for (int k = 0;
k < len; k++) {
printf("%d ",a[k]);
}
printf("\n");
}
printf("\n");
}
20.折半查找法
①基本思路:在有序表中,取中间元素作为比较对象,若给定值与中间元素的要查找的数相等,则查找成功;若给定值小于中间元素的要查找的数,则在中间元素的左半区继续查找; 若给定值大于中间元素的要查找的数,则在中间元素的右半区继续查找。不断重复上诉查找过程,直到查找成功。
#include <stdio.h>
int find(int a[],int num,int len){
int low=0,mid=0,high=0,key=0;
int flag = 1;
printf("len is %d\n",len);
low = 0,high = len-1;
while(flag){
mid = (low+high)/2;
if (a[mid] < num) {
low = mid;
}
if (a[mid] > num) {
high = mid;
}
if (a[mid] == num) {
key = mid;
flag = 0;
}
}
return key;
}
int main(int argc, const char *
argv[]) {
int a[] = {12,23,34,42,56,63,72,89,94};
int len = sizeof(a) / sizeof(int);
int num = 23;
int key = find(a, num,len);
printf("the key number is %d,key is %d\n",num,key);
return 0;
}
21.二维数组
①一个一维数组的每个元素又被声明为一个一维数组,从而构成二维数组,可以说是二维数组是一个特殊的一维数组。
②定义: 数组名[第一维的长度(行)] [第二维的长度(列)]; int a[2][3]; int b[1+3][3} ; #difine M 3 int c[M][M+3]。
③初始化:
1)完全初始化:
正常赋值:int a[2][3] = {{1,2,3},{2,3,4}};
连续赋值:int a[2][3] = {1,2,3,4,5,6};
可以省略第一维:int a[][3] = {{1,2,3},{4,5,6},{7,8,9}}; //等价于int a[3][3];
int a[][2] = {1,2,3,4,5,6,7,8}; //等价于int a[4][2]={1,2,3,4,5,6,7,8};
2)部分初始化:
int a[3][4]= {1}; //a[0][0]被赋值为1,其他全为0;
④存储方式:
1)计算机会给二维数组分配一块连续的存储空间;
2)数组名代表数组的首地址,从首地址开始,依次存入第一行、第二行....第n行;
3)每一行的存储方式,从行首地址开始,依次存储行的第1个元素、第2个元素...第n个元素;
4)每个元素占用相同的字节数(取决于数组类型);
5)并且数组中元素之间的地址是连续的;
6)首地址 = 数组名地址 = 第一行的地址 = 第一行第一个元素地址
相关文章推荐
- C++ Virtual详解
- 最常用的两种C++序列化方案的使用心得(protobuf和boost serialization)
- 八大排序算法的C++实现
- C++类型转换关键字 *_cast<type> (expression)
- C++类的所占空间
- C++11中std:bind()与SOCKET bind()冲突问题
- Heat
- C++播放wav音乐和音效
- [C语言]进阶|结构类型: 枚举, 结构, 类型定义
- C++ Primer快速入门之三:几种常见的控制语句
- C++对象内存布局 (二)
- [leetcode]Maximum Subarray (C语言)
- 两个栈来实现一个队列的C++代码(某公司社会早笔试题)
- C++ STL中哈希表 hash_map介绍
- C语言结构体及函数传递数组参数示例
- Tim Sweeney解释为什么Unreal Engine 4全面转向C++
- C语言-解析命令行参数
- C语言与汇编
- 常用C++第三方库
- c++ 内存四区简单总结