JAVA數據結構-數組&簡單排序

請參考百度文庫

1. 數組

數組(array)是相同類型變量的集合,可以使用共同的名字引用它。數組可被定義爲任何類型,可以是一維或多維。數組中的一個特別要素是通過下標來訪問它。數組提供了一種將有聯繫的信息分組的便利方法。

一維數組

一維數組(one-dimensional array)實際上是相同類型變量列表。要創建一個數組,你必須首先定義數組變量所需的類型。

通用的一維數組的聲明格式是: type var-name[];

獲得一個數組需要兩步:第一步,定義變量所需的類型;第二步,使用運算符new來爲數組所要存儲的數據分配內存,並把它們分配給數組變量。

數組的初始化(array initializer):包括在花括號之內用逗號分開的表達式的列表。Java會自動地分配一個足夠大的空間來保存指定的初始化元素的個數,而不必使用運算符new。

Java嚴格地檢查以保證不會意外地存儲或引用在數組範圍以外的值。Java的運行系統會檢查以保證所有的數組下標都在正確的範圍以內(在這方面java與C/C++從根本上不同,C/C++提供運行邊界檢查)。

多維數組
在Java中,多維數組(multidimensional arrays)實際上是數組的數組。例如,定義一個二維數組變量:int twoD[][] = new int[4][5];

2. 簡單排序

包括冒泡排序、選擇排序、插入排序

①. 冒泡排序

假設有N個數據需要排序,則從第0個數開始,依次比較第0和第1個數據,如果第0 個大於第1 個則兩者交換,否者什麼動作都不做,繼續比較第1個和第2 個……,這樣依次類推,直至所有數據都“冒泡”到了數據頂上。

代碼實現:

/**
  *  冒泡排序
  *  比較相鄰元素的大小,將小的前移,大的後移,就像水中的氣泡一樣,
  *  最小的元素經過幾次移動,最終會浮在水面上。
  *  2 7 4 6 9 1 首先比較最後兩個數字,發現1比9小,於是前移
  *  2 7 4 6 1 9 然後比較6和1
  *  2 7 4 1 6 9 繼續前移,然後是4和1
  *  2 7 1 4 6 9 7和1比較
  *  2 1 7 4 6 9 2和1
  *  1 2 7 4 6 9 
  *  至此,第一趟冒泡過程完成,
  *  最小的元素1被移到第一個,    
  *  不再參與後面的排序過程。
  *  下一趟冒泡過程同理,比較6和9,以此類推,最終得到結果。       
 **/
Public void bubbleSort(){
    int in, out;
    for(out = nElem - 1;out > 0;out--){
        for(in = 0;in < out;in++){
            if(a[in] > a[in + 1]){
                swap(in, in + 1);
            }
        }
    }
}
/**
  * 時間複雜度:
  * 因爲在每一趟排序中都使有序區增加了一個氣泡,
  * 因此在n-1趟排序之後,有序區中就有n-1個氣泡,
  * 而無序區中的氣泡的重量總是大於等於有序區中氣泡的重量,
  * 所以整個冒泡排序過程至少需要n-1趟排序。
  * 因此顯而易見,這個算法的時間複雜度也是O(n*n)。
***/

算法的時間複雜度:O(N2)

②. 選擇排序

假設有N條數據,則暫且標記第0個數據爲MIN(最小),使用OUT標記最左邊未排序的數據,然後使用IN標記第一個數據,依次與MIN進行比較,如果比MIN小,則將該數據標記爲MIN,當第一輪比較完後,最終的MIN與OUT標記數據交換,依次類推。

代碼實現:

/**
 * 選擇排序: 
 * 首先,找出數組中的最小元素,並用首位置的元素與它交換。
 * 然後,找出次大元素,並用第二個位置的元素與它交換。
 * 它重複性地選擇剩餘元素中的最小元素來完成排序。  
 * 
 * 當索引i從左向右遍歷時,
 * 其右邊的元素在數組中的位置就是其最終位置(而且再也不會被比較),
 * 所以當i到達右終端時,
 * 數組已經完全排序完畢。
**/
Public void selectSort(){
    int in, out, min;
    for(out = 0;out < nElems - 1;out++){
        min = out; //從第一個數開始
        For(int = out + 1;in < nElems;in++){
            if(a[in] < a[min]){
                min = in; //找到最小的替換
                swap(out, min);
            }
        }
    }
}

算法的時間複雜度:O(N2)

③. 插入排序

插入排序:類似於打牌。每抓一張牌我們的將其插入到已有的排好序的手牌中即爲,將新來的元素按順序放入一個已有的有序序列中。 在計算機實現中,我們需要將較大的元素移到右邊,爲插入的元素準備空間,然後再在空位置上插入該元素。

  • 8 2 4 9 3 6 首先我們考慮數字2,假設後面的數字不存在(手中只有一張8,又抓來了2),那麼顯然2應該放在8的前面。
  • 2 8 4 9 3 6 又抓來了一張4,現在大家都知道應該怎麼辦了吧?
  • 2 4 8 9 3 6 又來了個9,沒錯,正好不用換順序
  • 2 4 8 9 3 6 同樣的道理,考慮3該放的位置,顯然放在2和4的中間
  • 2 3 4 8 9 6 最後一個也是一樣,最後得到從小到大的序列
  • 2 3 4 6 8 9 完成排序

代碼實現:

Public void InsertionSort(){
    int in, out;
    for(out = 1;out < nElems;out++){
        long temp = a[out];
        in = out;
        while(in > 0&&a[in - 1] > temp){
            a[in] = a[in - 1];
            --in;
        }
    a[in] = temp;
    }   
}
/**
  * 時間複雜度:O(n*n)
  * 由於需要兩層循環,外層循環n-1次,內層循環每次遞增一次。
  * 當輸入完全從小到大有序時,
  * 只需要常數的時間,這當然是最好的情況。
  * 但是我們不能期望輸入,當輸入完全逆序時,最壞的情況就出現了。
 **/

算法的時間複雜度:O(N2)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章