請參考百度文庫。
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)。
***/
算法的時間複雜度:
②. 選擇排序
假設有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);
}
}
}
}
算法的時間複雜度:
③. 插入排序
插入排序:類似於打牌。每抓一張牌我們的將其插入到已有的排好序的手牌中即爲,將新來的元素按順序放入一個已有的有序序列中。 在計算機實現中,我們需要將較大的元素移到右邊,爲插入的元素準備空間,然後再在空位置上插入該元素。
- 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次,內層循環每次遞增一次。
* 當輸入完全從小到大有序時,
* 只需要常數的時間,這當然是最好的情況。
* 但是我們不能期望輸入,當輸入完全逆序時,最壞的情況就出現了。
**/
算法的時間複雜度: