鐵汁們,今天給大家分享一篇數(shù)組及詳解冒泡排序,來(lái)吧,開(kāi)造??
數(shù)組的定義:是一組相同類型元素的集合。
一維數(shù)組的創(chuàng)建和初始化
一維數(shù)組的創(chuàng)建
一維數(shù)組在創(chuàng)建時(shí),未給出確定的數(shù)組大小值,則該數(shù)組必須得初始化,數(shù)組的大小根據(jù)初始的內(nèi)容來(lái)確定,eg:int arr[]={1,2,3,4,5,6}。若不初始化,則編譯器會(huì)報(bào)錯(cuò)。
一維數(shù)組的初始化
由于博主在前面給鐵汁分享函數(shù)棧幀的創(chuàng)建與銷毀可知:
局部變量或者定義在函數(shù)體內(nèi)的數(shù)組 是在棧上開(kāi)辟空間,如果不初始化,根據(jù)函數(shù)棧幀的知識(shí)可知,則其值默認(rèn)為隨機(jī)值。
數(shù)組初始化的定義:數(shù)組在創(chuàng)建的同時(shí)給數(shù)組內(nèi)容賦予初始值。eg:char arr[6]=“abcde”;
一維數(shù)組的應(yīng)用
訪問(wèn)數(shù)組中的元素,要使用[ ]下標(biāo)引用操作符,操作數(shù)為數(shù)組名、數(shù)組下標(biāo)值。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
int sz = sizeof(arr) / sizeof(arr[0]); //求任意類型元素總個(gè)數(shù),sizeof為操作符
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]); //訪問(wèn)數(shù)組元素,下標(biāo)引用操作符
}
return 0;
}
數(shù)組是通過(guò)下標(biāo)來(lái)進(jìn)行訪問(wèn)的,下標(biāo)值從0開(kāi)始。
求數(shù)組元素總個(gè)數(shù): int sz = sizeof(arr) / sizeof(arr[0]),sizeof為操作符,操作數(shù)是類型或者變量,計(jì)算的是類型或者變量占內(nèi)存的大小,單位為字節(jié)。
一維數(shù)組在內(nèi)存中的存儲(chǔ)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("arr[%d]=%p\n",i, &arr[i]);
}
return 0;
}
由圖可知隨之?dāng)?shù)組下標(biāo)的增長(zhǎng),數(shù)組下標(biāo)也是成一定規(guī)律進(jìn)行增長(zhǎng),相鄰兩個(gè)元素地址相差4個(gè)字節(jié)。
二維數(shù)組的創(chuàng)建和初始化
二維數(shù)組的創(chuàng)建
二維數(shù)組在創(chuàng)建時(shí),行可以省略,但列不能省略,若要省略行,則二維數(shù)組必須得要初始化,行的值根據(jù)初始化的內(nèi)容來(lái)確定。
二維數(shù)組的初始化
二維數(shù)組初始化的定義:數(shù)組在創(chuàng)建的同時(shí)給數(shù)組內(nèi)容賦予初始值。eg:int arr[4][5]={{1,2},{3,4}};
二維數(shù)組的應(yīng)用
二維數(shù)組與一維數(shù)組相同,也是通過(guò)下標(biāo)來(lái)進(jìn)行訪問(wèn)。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int arr[4][3] = {{0,1,2},{3,4,5},{6,7,8},{9,10,11}};
int i = 0;
for (i = 0; i <4; i++)
{
int j = 0;
for (j = 0; j < 3; j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
return 0;
}
二維數(shù)組在內(nèi)存中的存儲(chǔ)
%p:打印地址,參數(shù)變量要加取地址操作符&。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int arr[4][3] = {{0,1,2},{3,4,5},{6,7,8},{9,10,11}};
int i = 0;
for (i = 0; i <4; i++)
{
int j = 0;
for (j = 0; j < 3; j++)
{
printf("%p\n",&arr[i][j]);
}
}
return 0;
}
由圖可知,隨著下標(biāo)的增長(zhǎng),地址成一定的規(guī)律增長(zhǎng)(相鄰兩元素地址相差4個(gè)字節(jié)),即:二維數(shù)組在內(nèi)存中是連續(xù)存放的。
數(shù)組越界問(wèn)題
數(shù)組下標(biāo)是有范圍限制的。
c語(yǔ)言標(biāo)準(zhǔn)規(guī)定,數(shù)組下標(biāo)從0開(kāi)始,若數(shù)組中有n個(gè)元素,則最后一個(gè)元素對(duì)應(yīng)的下標(biāo)值不超過(guò)n-1,即:數(shù)組下標(biāo)值的范圍為0到n-1,若小于0或超過(guò)n-1,就是數(shù)組的越界訪問(wèn)啦~,起始就是超出了數(shù)組的合法空間(本身向內(nèi)存申請(qǐng)空間。
c本身是不做下標(biāo)越界的檢查,編譯器也不一定會(huì)報(bào)錯(cuò),但編譯器不報(bào)錯(cuò),并不說(shuō)明代碼就是正確的,作為一名程序員,我們應(yīng)該要具備在寫代碼時(shí),自己做好數(shù)組越界檢查。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i <= sz; i++) //此處不能等于sz,造成了數(shù)組越界
{
printf("%d ", arr[i]);
}
return 0;
}
一維數(shù)組、二維數(shù)組行和列均有越界的可能性。
數(shù)組作為函數(shù)參數(shù)
數(shù)組名的含義及特殊兩個(gè)例子
通常情況下,數(shù)組名是首元素的地址(兩個(gè)例外)
1 sizeof(數(shù)組名):計(jì)算的是整個(gè)數(shù)組的大小,單位是字節(jié),sizeof內(nèi)部單獨(dú)放一個(gè)數(shù)組名,數(shù)組名表示整個(gè)數(shù)組
2.&數(shù)組名:取出的整個(gè)數(shù)組的地址,&數(shù)組名,數(shù)組名表示整個(gè)數(shù)組。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int arr[5] = { 0,1,2,3,4 };
printf("%p\n", arr);
printf("%p\n", arr+1);
printf("\n");
printf("%p\n", &arr[0]);
printf("%p\n", &arr[0]+1);
printf("\n");
printf("%p\n",&arr);
printf("%p\n", &arr + 1);
return 0;
}
冒泡排序詳解
適用條件:整形數(shù)組進(jìn)行升序排序(也適用于數(shù)組中含有相同元素在不同位置處的升序排序)。
實(shí)現(xiàn)思想:相鄰兩元素兩兩進(jìn)行比較、采用兩層for循環(huán)(第一層for循環(huán)控制總趟數(shù)、第二層for循環(huán)控制每一趟兩相鄰元素之間要比較的對(duì)數(shù)),每一趟都可以讓某一個(gè)元素到達(dá)其最終所在的位置處。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void Maopao(int arr[10], int sz)
{
int i = 0;
for (i = 0; i < sz - 1; i++)//控制要排序的總趟數(shù)
{
int flag = 1;//假設(shè)進(jìn)行每一趟排序之前該數(shù)組已經(jīng)有序,無(wú)需依次把每個(gè)元素進(jìn)行比較,效率高
int j = 0;
for (j = 0; j < sz - 1 - i; j++) //控制每一趟兩相鄰元素之間要比較的對(duì)數(shù)
{
if (arr[j] > arr[j + 1])
{
flag = 0; //說(shuō)明該數(shù)組此時(shí)并未達(dá)到是有序的
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
if (flag == 1)
{
break; //該數(shù)組為有序數(shù)組,直接跳出循環(huán),無(wú)需進(jìn)行比較,效率提高
}
}
}
int main()
{
int arr[10] = { 10,9,4,7,6,5,2,3,1 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]); //計(jì)算數(shù)組中元素的總大小,切不可放在冒泡函數(shù)實(shí)現(xiàn)中,不然sz值為1(4/4=1)
Maopao(arr, sz); //數(shù)組作為參數(shù)傳參時(shí),傳的是數(shù)組名,首元素的地址,為4個(gè)字節(jié),arr==int* arr
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]); //打印
}
return 0;
}
掃雷與多子棋的實(shí)現(xiàn)
鐵子們~此處代碼的實(shí)現(xiàn)博主已經(jīng)在其他篇博客詳細(xì)講解了,請(qǐng)鐵鐵們點(diǎn)擊此鏈接觀看呦掃雷實(shí)現(xiàn)詳解、三子棋及多子棋的實(shí)現(xiàn)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-465274.html
鐵鐵們,數(shù)組及詳解冒泡排序講解就到此結(jié)束啦,請(qǐng)動(dòng)動(dòng)你們的手給作者點(diǎn)個(gè)??鼓勵(lì)吧,你們的鼓勵(lì)就是我的動(dòng)力?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-465274.html
到了這里,關(guān)于數(shù)組及詳解冒泡排序的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!