摘要:代碼修正后修改后,我們可以排列無(wú)限個(gè)數(shù)字這樣,一個(gè)冒泡排序就完成了。,數(shù)組名表示整個(gè)數(shù)組。
首先感謝一位博主: 原來(lái)45 他寫(xiě)的博客內(nèi)容十分詳細(xì),為我創(chuàng)造博客提供了莫大的幫助,也為我解決了很多困難。
先貼出2篇他的文章
C語(yǔ)言從入門(mén)到入土(入門(mén)篇)(數(shù)組p1)_原來(lái)45的博客-CSDN博客
C語(yǔ)言從入門(mén)到入土(入門(mén)篇)(數(shù)組p2以及對(duì)遞歸的補(bǔ)充)_原來(lái)45的博客-CSDN博客
目錄
2.二維數(shù)組的創(chuàng)建、初始化、使用和儲(chǔ)存
int arr1[10]={1,2,3}; //這里代表前三個(gè)數(shù)初始化為1,2,3,而后面剩下的數(shù)組全部初始化為0; int arr2[]={1,2,3,4}; //這里表示這個(gè)數(shù)組的4個(gè)數(shù)字被初始化成了1,2,3,4,總共4個(gè)元素char arr3[]={"a",98,"c"}; //這里的98實(shí)際上儲(chǔ)存著的是b的ASCII碼值char arr4[]="abcdef"; //這個(gè)數(shù)組儲(chǔ)存了7個(gè)元素,最后一個(gè)是/0
當(dāng)用雙引號(hào)包括時(shí),結(jié)尾會(huì)自動(dòng)加一個(gè)/0。
sizeof 和 strlen 的區(qū)別:
1)strlen是一個(gè)庫(kù)函數(shù),計(jì)算的是字符串的長(zhǎng)度,并且只能針對(duì)字符串(無(wú)法針對(duì)整型的數(shù)),關(guān)注字符串中是否有/0,同時(shí)strlen計(jì)算的是/0之前的字符個(gè)數(shù)。即/0不會(huì)被strlen記錄大小。
2)sizeof是一個(gè)操作符(運(yùn)算符),sizeof是用來(lái)計(jì)算變量所占空間內(nèi)存大小的,任何類(lèi)型都是可以使用的,只關(guān)注空間大小,不在乎內(nèi)存中是否存在/0。即/0也會(huì)被sizeof記錄大小。
創(chuàng)建的方式如下:?
int arr [3][4];char arr[3][5];double arr[2][4];
這里以 int arr[3][4] 為例,看看二維數(shù)組是怎么存放數(shù)據(jù)的
?3指的是有3行(行豎著)? 4指的是有4列(列橫著)
如何初始化呢?
int arr [ 3 ][ 4 ] = { 1 , 2 , 3 , 4 };int arr [ 3 ][ 4 ] = {{ 1 , 2 },{ 4 , 5 }};int arr [][ 4 ] = {{ 2 , 3 },{ 4 , 5 }}; //注意這里,行可以省略,列不能省略
那如果初始化沒(méi)有那么多數(shù)字呢?不夠的數(shù)字就會(huì)被初始化成0。
同時(shí),也可以這樣子初始化
怎么使用二維數(shù)組呢?
?二維數(shù)組如何存儲(chǔ)呢?
?其實(shí)二維數(shù)組在內(nèi)存中也是連續(xù)開(kāi)辟空間的,每一個(gè)數(shù)字往后4個(gè)字節(jié)才是下一個(gè)數(shù)字。只不過(guò)為了方便理解,把二維數(shù)組畫(huà)成矩陣的形狀更加方便理解。
舉個(gè)例子:數(shù)組共有十個(gè)數(shù),而你訪問(wèn)了第十一個(gè)數(shù),這就叫越界。
這里越界了但是沒(méi)有報(bào)錯(cuò):
?這里報(bào)錯(cuò)了:
什么事冒泡排序?
現(xiàn)有一個(gè)有10個(gè)數(shù)的數(shù)組,10個(gè)數(shù)字隨機(jī)排序,讓其有序排列,這就是冒泡排序。
首先我們先來(lái)了解如何求一個(gè)數(shù)組的長(zhǎng)度:
int sz = sizeof(arr) / sizeof(arr[0]);
用這個(gè)數(shù)組的總占空間大小除以這個(gè)數(shù)組第一個(gè)元素所占空間大小,就得到了這個(gè)數(shù)組的長(zhǎng)度。
?我們先寫(xiě)主函數(shù):
int main(){ int arr[] = { 3,6,4,5,8,0,7,9,1,2};//定義一個(gè)數(shù)組 bubble_sort(arr, sz);//調(diào)用函數(shù) int i = 0; for (i = 0; i < sz-1; i++) { printf("%d ", arr[i]);//打印數(shù)組的每一位 } return 0;}
排序函數(shù),核心思想:兩個(gè)數(shù)相比較,如果前一個(gè)數(shù)比后一個(gè)數(shù)大,兩個(gè)數(shù)字就交換位置
void bubble_sort(int arr[]){int sz = sizeof(arr) / sizeof(arr[0]); int j = 0; for (j = 0; j < sz - 1; j++)//我們比的時(shí)候只在同一個(gè)位置比,然后后面誰(shuí)小我們就把誰(shuí)換過(guò)來(lái),一直到最后一個(gè)數(shù)我們就發(fā)現(xiàn)有sz個(gè)數(shù),我們就要進(jìn)行sz-1趟比較 { int k = 0; for (k = 0; k < sz - 1 - j; k++)每一趟比較的次數(shù)就是 sz-1 再 -j(因?yàn)榍懊娴臄?shù)已經(jīng)排好了所以減去) { if (arr[k] >= arr[k + 1]) { int tmp = arr[k]; arr[k] = arr[k + 1]; arr[k + 1] = tmp; } } }}
代碼運(yùn)行,發(fā)現(xiàn)代碼沒(méi)有達(dá)到我們想要的作用,我們可以打開(kāi)調(diào)試看一下:
?為什么sz的值是1呢?哪里出問(wèn)題了呢?
當(dāng)我們傳遞arr時(shí),傳遞的其實(shí)是首元素地址,形參接受的也是首元素地址,arr為指針,用sizeof算出來(lái)的大小是4,除以arr第一個(gè)元素的大小,4/4=1,所以我們要把sz放在主函數(shù)里面求,直接傳一個(gè)整形的sz的值給函數(shù)。
代碼修正后:
void bubble_sort(int arr[],int sz){ int j = 0; for (j = 0; j < sz - 1; j++) { int k = 0; for (k = 0; k < sz - 1 - j; k++) { if (arr[k] > arr[k + 1]) { int tmp = arr[k]; arr[k] = arr[k + 1]; arr[k + 1] = tmp; } } }}int main(){ int arr[] = {3,5,7,9,1,2,4,6,0}; int sz = sizeof(arr) / sizeof(arr[0]); bubble_sort(arr, sz); int i = 0; for (i = 0; i < 10; i++) { printf("%d ", arr[i]); } return 0;}
修改后,我們可以排列無(wú)限個(gè)數(shù)字
void bubble_sort(int arr[],int sz){ int j = 0; for (j = 0; j < sz - 1; j++) { int k = 0; for (k = 0; k < sz - 1 - j; k++) { if (arr[k] >= arr[k + 1]) { int tmp = arr[k]; arr[k] = arr[k + 1]; arr[k + 1] = tmp; } } }}int main(){ int arr[] = { 3,2,6,666666,55555555,7777777,2572457,2472457,568458,59679,2,4,7,8,4,9,4,2,8,1,4}; int sz = sizeof(arr) / sizeof(arr[0]); bubble_sort(arr, sz); int i = 0; for (i = 0; i < sz-1; i++) { printf("%d ", arr[i]); } return 0;}
這樣,一個(gè)冒泡排序就完成了。?
先說(shuō)結(jié)論:數(shù)組名是數(shù)組首元素的地址。
即
printf ( "%p/n" , arr);printf ( "%p/n" , & arr[0]);//兩個(gè)表達(dá)式意思相等
但有兩個(gè)例外:(在此假設(shè)數(shù)組名字定為arr)
1. sizeof(arr)?,計(jì)算的是整個(gè)數(shù)組的大小。?sizeof?內(nèi)部多帶帶放一個(gè)數(shù)組名,數(shù)組名表示整個(gè)數(shù)組。
2.? &arr,取出的是數(shù)組的地址。?&arr,數(shù)組名表示整個(gè)數(shù)組。
對(duì)于第二點(diǎn),額外補(bǔ)充一下:
如果 &arr +1,即 數(shù)組+1 則會(huì)跳過(guò)這個(gè)數(shù)組所有的數(shù)字,會(huì)在內(nèi)存中直接顯示到這個(gè)數(shù)組最后一個(gè)數(shù)字的后面。
在此,數(shù)組的基礎(chǔ)知識(shí)就講完了,消化去吧~下一篇就是恐怖的井字棋!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/123498.html
摘要:我們以冒泡排序?yàn)槔M實(shí)現(xiàn)函數(shù)。交換每單位字節(jié)對(duì)于的二進(jìn)制序列這樣,冒泡排序就能排序多種數(shù)據(jù)類(lèi)型,模擬實(shí)現(xiàn)了函數(shù),當(dāng)然也可以使用其他的排序方法模擬實(shí)現(xiàn)函數(shù)。 ??...
摘要:冒泡排序就這么簡(jiǎn)單在我大一的時(shí)候自學(xué)語(yǔ)言和數(shù)據(jù)結(jié)構(gòu),我當(dāng)時(shí)就接觸到了冒泡排序當(dāng)時(shí)使用的是語(yǔ)言編寫(xiě)的。我最開(kāi)始接觸的就是冒泡排序,所以這篇博文主要講的是冒泡排序。 冒泡排序就這么簡(jiǎn)單 在我大一的時(shí)候自學(xué)c語(yǔ)言和數(shù)據(jù)結(jié)構(gòu),我當(dāng)時(shí)就接觸到了冒泡排序(當(dāng)時(shí)使用的是C語(yǔ)言編寫(xiě)的)?,F(xiàn)在大三了,想要在暑假找到一份實(shí)習(xí)的工作,又要回顧一下數(shù)據(jù)結(jié)構(gòu)與算法的知識(shí)點(diǎn)了。 排序?qū)ξ覀儊?lái)說(shuō)是一點(diǎn)也不陌生了,當(dāng)...
摘要:故使用無(wú)具體類(lèi)型,又稱(chēng)通用類(lèi)型,即可以接收任意類(lèi)型的指針,但是無(wú)法進(jìn)行指針運(yùn)算解引用,整數(shù)等。求指針?biāo)甲止?jié)而不是解引用訪問(wèn)權(quán)限大小。數(shù)組就是整個(gè)數(shù)組的大小,數(shù)組元素則是數(shù)組元素的大小,指針大小都為。 ...
閱讀 2483·2021-11-16 11:45
閱讀 2457·2021-10-11 10:59
閱讀 2260·2021-10-08 10:05
閱讀 3850·2021-09-23 11:30
閱讀 2380·2021-09-07 09:58
閱讀 819·2019-08-30 15:55
閱讀 782·2019-08-30 15:53
閱讀 1931·2019-08-29 17:00