樹的遍歷算法
-
前序遍歷(Pre-Order Traversal)
對於當前節點,先輸出該節點,然後輸出他的左孩子,最後輸出他的右孩子。以上圖爲例,遞歸的過程如下:
(1):輸出 1,接着左孩子;
(2):輸出 2,接着左孩子;
(3):輸出 4,左孩子爲空,再接着右孩子;
(4):輸出 6,左孩子爲空,再接着右孩子;
(5):輸出 7,左右孩子都爲空,此時 2 的左子樹全部輸出,2 的右子樹爲空,此時 1 的左子樹全部輸出,接着 1 的右子樹;
(6):輸出 3,接着左孩子;
(7):輸出 5,左右孩子爲空,此時 3 的左子樹全部輸出,3 的右子樹爲空,至此 1 的右子樹全部輸出,結束。
最終結果如下:1>2>4>6>7>3>5中序遍歷(In-Order Traversal)
對於當前結點,先輸出它的左孩子,然後輸出該結點,最後輸出它的右孩子。
最終結果如下:4>6>7>2>5>3>1
後序遍歷(Post-Order Traversal)
對於當前結點,先輸出它的左孩子,然後輸出它的右孩子,最後輸出該結點
圖搜索算法
深度優先搜索(DFS)
深度優先搜索總是對最近才發現的結點 vv 的出發邊遍歷直到結點的所有出發邊均被發現,然後再“回溯”到 vv 的前驅結點來搜索其出發邊。
廣度優先搜索(BFS)
給定圖G=(V,E)G=(V,E)以及源點 SS, 通過調用廣度優先算法可以發現從源點到達的所有頂點,同時生產一顆 “廣度優先搜索樹”
查找算法
二分查找法
用二分查找法的時間複雜度會是O(log(n))。
首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查找關鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查找關鍵字,則進一步查找前一子表,否則進一步查找後一子表。重複以上過程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在爲止,此時查找不成功。
排序算法
複雜度都是O(n)
- 冒泡排序
它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果順序(如從大到小、首字母從Z到A)錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。
這個算法的名字由來是因爲越小的元素會經由交換慢慢“浮”到數列的頂端(升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名“冒泡排序”。
public static void mpSort(int[] arr){
for (int i=0;i<arr.length;i++){
for (int j=0;j<arr.length-i-1;j++){
if (arr[i]<=arr[j]){
//交換順序
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
- 插入排序
插入排序,一般也被稱爲直接插入排序。對於少量元素的排序,它是一個有效的算法 [1] 。插入排序是一種最簡單的排序方法,它的基本思想是將一個記錄插入到已經排好序的有序表中,從而一個新的、記錄數增1的有序表。在其實現過程使用雙層循環,外層循環對除了第一個元素之外的所有元素,內層循環對當前元素前面有序表進行待插入位置查找,並進行移動 - 選擇排序
選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理是:第一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,然後再從剩餘的未排序元素中尋找到最小(大)元素,然後放到已排序的序列的末尾。以此類推,直到全部待排序的數據元素的個數爲零。選擇排序是不穩定的排序方法。
複雜度爲O(n*log(n))的排序算法
- 歸併排序(merge sort)
歸併排序(MERGE-SORT)是利用歸併的思想實現的排序方法,該算法採用經典的分治(divide-and-conquer)策略(分治法將問題分(divide)成一些小的問題然後遞歸求解,而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,即分而治之 - 快速排序(quick sort)
基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
/****
*
* @param arr 排序數組
* @param low 最開始的左邊的索引
* @param high 右邊的索引
*/
public static void quickSort(int[] arr, int low, int high) {
int i, j, temp, t;
if (low > high) {
return;
}
i = low;
j = high;
//temp就是基準位
temp = arr[low];
while (i < j) {
//先看右邊,依次往左遞減
while (temp <= arr[j] && i < j) {
j--;
}
//再看左邊,依次往右遞增
while (temp >= arr[i] && i < j) {
i++;
}
//如果滿足條件則交換
if (i < j) {
t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
}
//最後將基準爲與i和j相等位置的數字交換
arr[low] = arr[i];
arr[i] = temp;
//遞歸調用左半數組
quickSort(arr, low, j - 1);
//遞歸調用右半數組
quickSort(arr, j + 1, high);
}