01-數(shù)組-內(nèi)存存儲細(xì)節(jié)
變量
變量在內(nèi)存中的存儲
由于變量的內(nèi)存尋址是從大到小,所以存儲數(shù)據(jù)時(shí) 會(huì)從高字節(jié)開始存儲
數(shù)組
注意 : 數(shù)組的存儲 和 變量有點(diǎn)不一樣, 數(shù)組存儲元素, 是從所占用的低字節(jié)開始
其實(shí) 數(shù)組名 就是 數(shù)組的地址
02-數(shù)組-注意點(diǎn)
注意點(diǎn) : 在使用數(shù)組的時(shí)候, 一定不要訪問 不屬于自己的存儲空間,這樣會(huì)導(dǎo)致數(shù)據(jù)混亂
有時(shí)候如果訪問了 不屬于自己的存儲空間, 程序會(huì)報(bào)錯(cuò)
03-數(shù)組-練習(xí)1
1.從鍵盤 錄入當(dāng)天出售BTB的價(jià)格 并 計(jì)算出售 BTB的總價(jià) 和 平均價(jià)(比如說一天 出售了3個(gè)比特幣)
04-函數(shù)和數(shù)組1
變量
基本數(shù)據(jù)類型作為 函數(shù)的參數(shù) 是 值傳遞
如果形參是基本數(shù)據(jù)類型, 在函數(shù)中 修改形參的值 不會(huì)影響到外面的值
數(shù)組
注意 : 數(shù)組名作為函數(shù)的參數(shù)傳遞, 傳遞的數(shù)組的地址
因?yàn)閿?shù)組名 就是 數(shù)組的地址 &number = &number[0] == number
注意 : 如果數(shù)組作為函數(shù)的形參, 元素的個(gè)數(shù)可以省略
如果形參是數(shù)組, 那么在函數(shù)中修改形參的值, 會(huì)影響到實(shí)參的值
05-數(shù)組和函數(shù)2
如果傳遞的數(shù)組名稱, 其實(shí)傳遞的是地址
如果傳遞的地址, 其實(shí)傳遞的是指針
指針在64 編譯環(huán)境 占8個(gè)字節(jié)
注意 : 如果數(shù)組作為形參,那么在函數(shù)中就不能通過數(shù)組的名稱 計(jì)算出數(shù)組元素的個(gè)數(shù)
因?yàn)橄到y(tǒng)會(huì)自動(dòng)將 數(shù)組形參轉(zhuǎn)換為指針, 指針占用8個(gè)字節(jié)
06-數(shù)組-練習(xí)2
設(shè)計(jì)一個(gè)函數(shù) int arrayMax(int a[], int count) 找出數(shù)組元素的最大值
07-數(shù)組-練習(xí)3
1.從鍵盤輸入3個(gè)0~9的數(shù)字,然后輸出0~9中 哪些數(shù)字沒有出現(xiàn)過
08-數(shù)組-練習(xí)4
1.要求 從鍵盤輸出 6個(gè)0~9的數(shù)字,排序后輸出
09-選擇排序
已知一個(gè)無序的數(shù)組,里面有5個(gè)元素,要求對數(shù)組進(jìn)行排序
選擇排序: 從小到大
特點(diǎn) :
拿到其中一個(gè)元素的值 和 其他元素進(jìn)行比較, 完全比較完一次之后,最值出現(xiàn)在第0位
倒三角形式
比如有4個(gè)數(shù)
1 比 2\3\4
2 比 3\4
3 比 4
比較次數(shù)就是一個(gè)倒三角的比較
***
**
*
10-選擇排序舞蹈
http://www.56.com/u86/v_ODU0ODM5Nzk.html
11-冒泡排序
冒泡排序
特點(diǎn)
使用相鄰的兩個(gè)元素進(jìn)行比較,每完全比較完一次,最值出現(xiàn)在末尾
規(guī)律:倒三角
****
***
**
*
12-排序優(yōu)化
#pragma 1. 選擇排序
void selectSort(int nums[],int length)
{
for (int i = 0; i < length -1 ; i++) {
for (int j = i + 1; j < length; j++) {
if (nums[i] > nums[j]) {
swap(nums, i, j);
}
}
printf("\n");
}
}
#pragma 2.冒泡排序
void bubbleSort(int nums[],int length)
{
for (int i = 0; i < 4; i++) {
for (int j = 0; j < length -1 -i; j++) {
if (nums[j] > nums[j+1]) {
swap(nums, j, j+1);
}
}
}
}
void swap(int nums[], int i,int j)
{
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
13-折半查找
折半查找的原理
1.數(shù)組必須是有序的
2.必須已知min和max(知道范圍)
3.動(dòng)態(tài)計(jì)算mid的值,取出mid對應(yīng)的值 進(jìn)行比較
4.如果mid對應(yīng)的值 大于了 需要查找的值, 那么max要變小 為 mid - 1
5.如果mid對應(yīng)的值 小于了 需要查找的值, 那么mix要變大 為 mid + 1
14-折半查找-練習(xí)
現(xiàn)在有一個(gè)有序的數(shù)組, 要求給定一個(gè)數(shù),將該數(shù)字插入到數(shù)組中,還要保證數(shù)組是有序的
其實(shí)就是找到插入需要插入的數(shù)字的位置
其實(shí)這個(gè)位置就是min的位置
15-進(jìn)制查表法
void printfOct2(int value)
{
// 1.定義一個(gè)數(shù)組,用于保存八進(jìn)制中所有的取值
char charValue[11] = {'0','1','2','3','4','5','6','7'};
// 2.定義一個(gè)數(shù)組,用與保持查詢后的結(jié)果
char result[11] = {'0'};
// 3.定義一個(gè)變量,用于記錄當(dāng)前需要存儲到查詢結(jié)果數(shù)組的索引
int pos = 11;
while (value != 0) {
int res = value & 7;
// 2.利用取出來的值 到表中查詢對應(yīng)的結(jié)果
char c = charValue[res];
// 3.存儲查詢的結(jié)果 (從最后一位開始存儲)
result[--pos] = c;
// 4.移除二進(jìn)制被取出的三位
value = value >> 3;
// printf("pos = %i\n",pos);
}
// 4.打印結(jié)果
for (int i = pos; i < 11; i++) {
printf("%c",result[i]);
}
printf("\n");
}
16-進(jìn)制查表法-優(yōu)化
// 轉(zhuǎn)換所有的進(jìn)行
// value就是需要轉(zhuǎn)換的數(shù)值
// base就是需要&上的數(shù)
// offset 就是需要 右移的位數(shù)
void total(int value,int base,int offset)
{
// 1.定義一個(gè)數(shù)組,用于保存十六進(jìn)制中所有的取值
char charValue[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
// 2.定義一個(gè)數(shù)組,用與保持查詢后的結(jié)果
char result[32] = {'0'};
// 3.定義一個(gè)變量,用于記錄當(dāng)前需要存儲到查詢結(jié)果數(shù)組的索引
int pos = sizeof(result)/sizeof(result[0]);
while (value !=0) {
// 取出4位的值
int res = value & base; // 1 7 15
// 利用這個(gè)值 作為索引去數(shù)組中 查詢對應(yīng)的十六進(jìn)制的值
char c = charValue[res];
// printf("%c",c);
// 將取出來的值 放到用于存儲結(jié)果的數(shù)組中
result[--pos] = c;
// 每取完一次 就干掉他最低的4位
value = value >> offset; // 1 3 4
// printf("pos = %i\n",pos);
}
for (int i = pos; i < 32; i++) {
printf("%c",result[i]);
}
printf("\n");
}