C語言 陣列與氣泡排序
17.陣列
①
在程式設計中,為了處理方便,把具有相同型別的若干變數按有序的形式組織起來。這些按序排列的同類資料元素的集合稱為陣列。
在C語言中,陣列屬於構造資料型別。一個數組可以分解為多個數組元素,這些陣列元素可以是基本資料型別或是構造型別。
陣列的幾個名字:
1)陣列:一組具有相同資料型別的資料的有序的集合;
2)陣列元素:構成陣列的資料。
3)陣列的下標:是陣列的位置的一個索引或指示;
4)陣列的維數:陣列元素下標的個數。根據陣列的維數可以氛圍一維、二維、三維、多維陣列。
②按儲存的內容分類
1)數值陣列:用來儲存數值
2)字元陣列:用來儲存字元'a'
3)指標陣列:用來存放指標(地址)
4)結構陣列:用來存放一個結構體型別的資料
③陣列定義的注意事項
1)陣列長度可以是一個常量,也可以是一個常量表達式;
2)數祖名的命名規則:嚴格按照識別符號的命名規範;
3)數祖名不能和其他變數同名;
4)陣列的長度不可以為一個變數(C99標準要求),但在Xcode優化下可以;
5)陣列的長度可以使用 巨集定義 #define M 5; int a[M];
6)在定義陣列的時候,還可以定義普通變數。 int x,y,a[];
④陣列的初始化
1)定義同時完全初始化,int a[3] = {1,2,3}; 或者 int a[] = {1,2,3,4}; 注意:不允許int len =3; int a[len] = {1,2,3};
2)定義同時部分初始化, int a1[3] = {1,2}; 或者 int a1[10] = {[3]=23,[8]=34};(表示下標為3,初值為23;下標為8,初值為34)
3)先定義,然後在初始化,int a2[2]; a2[1]=1; a2[2]=2;
如果定義了陣列,不進行初始化,裡面的值為隨機的垃圾數;如果進行部分初始化,沒有初始化那部分元素自動被系統初始化為0;
特別強調:使用先定義後初始化的方式,如果部分初始化,系統不會對未初始化的那部分元素進行賦值0的操作。
⑤陣列的引用
陣列元素是組成陣列的基本單元。陣列元素也是一種變數。其標識方法為數祖名後跟一個下標。下標表示了元素在陣列中的順序號;
如果要逐個訪問陣列的元素的話,這就叫陣列的遍歷。
⑥陣列的儲存方式
1)計算機會給陣列分配一塊連續的儲存空間;
2)陣列名代表陣列的首地址,從首地址位置,依次存入陣列的第1個、第2個....、第n個元素;
3)每個元素佔用的相同的位元組數(取決於陣列型別);
4)並且元素之間的地址是連續的;
char字元是以他們的ascll碼值進行儲存的,先分配的陣列地址高。陣列地址可以不連續,陣列各元素的地址一定是連續的。
&a[0]第一個元素的地址,a[0]第一個元素的值
⑦一維陣列長度計算方法
int a[] = {1,2,3,4,5}; int len = 0;
len = sizeof(a) / sizeof(int);
⑧陣列名作為函式引數
在C語言中,數祖名除作變數的識別符號之外,陣列名還代表了該陣列在記憶體中的起始地址,因此,當陣列名作函式引數時,實參和形參之間不是“值傳遞",而是“地址傳遞” ,實引數組名將該陣列的起始地址傳遞給形引數組,兩個陣列共享一段記憶體單元,編譯系統不再為形引數組分配儲存單元。
注意點:
1)形引數組的型別和長度要和實參一致;
2)形參的陣列長度和實參的長度可以不一致,雖不會報錯,執行的結果和實際不相符;
3)形引數組的長度可以不寫;
4)數祖名作為函式引數後,陣列的長度資訊丟失:在C語言中規定,不管什麼型別的資料,資料的記憶體地址在記憶體中佔用8個位元組;
18.氣泡排序(Bubble Sort)
氣泡排序分為:大數下沉、小數上浮
//大數下沉
for (int i = 0; i<len - 1; i++) {
for (int j = 0; j < len-1-i; j++) {
if (a[j] > a[j+1]) {
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
for (int i = 0; i < len; i++) {
printf("%d ",a[i]);
}
printf("\n");
}
printf("\n");
}
//小數上浮
for (int i = 0; i < len-1; i++) {
for (int j = 0; j < len-1-i; j++) {
if(a[j+1]<a[j]){
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
for (int i = 0; i < len; i++) {
printf("%d ",a[i]);
}
printf("\n");
}
printf("\n");
}