常見算法的思想,面試必備

樹的遍歷算法

在這裏插入圖片描述

  • 前序遍歷(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);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章