1. 程式人生 > >C語言 陣列與氣泡排序

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");

    }