1. 程式人生 > >筆面試常考資料結構演算法總結

筆面試常考資料結構演算法總結

e最近開始投各種技術類的崗位,於是乎覺得必須補一下之前的資料結構演算法知識了,因為真的很重要!幾乎每家面試都會問到其中的幾個演算法。本文部分演算法是從其他大神博主那邊搬運的,大家可以搜尋相關演算法檢視其他大神的解說和思路~~~~
穩定性:排序演算法是否穩定,根據序列中相同的元素排序前後的位置來判斷,如果兩個相同元素經過排序後,其相對位置未發生變化,則稱該排序是穩定的。
注:對陣列型序列的插入操作要考慮移位;後移:a[i+1]=a[i];前移:a[i-1]=a[i].
1.插入類排序
1)直接插入排序
定義,對於一個待排序列,如a[ ]=1,3,4,6,5,7,8;令i=1,首先取出a[1],將a[1]插入到序列中,當前a[1]只需和a[0]相比,然後將其插入適當位置,i++;每次將a[i]插入到a[0]至a[i-1]的序列中(因為a[i]之前的序列已經有序)。
對於n個數,要進行n-1趟插入排序,所以其時間複雜度為O(n^2),其空間複雜度為O(1),該排序是穩定的;
若待排序列為正序,時間複雜度為O(n),當要排序的資料量很大時,不適合用該方法。 直接插入排序常出現在筆試的選擇題中。
C++程式碼實現:

int Insort(int A[],length){
        int temp=0;
        for(int i=1;i<length;i++)
          {
              if(A[i]<A[i-1])
              {
                 temp=A[i];
                 for(int j=i-1;j>=0&&A[j]>temp;j--)
                 {
                    A[j+1]=A[j];
                 }
                 A[j+1
]=temp; //將temp放在該放的位置 } } return A; }

2)折半插入排序
其定義為,首先通過折半查詢(轉查詢演算法)找到資料要插入的位置,再對序列中的資料進行移動並插入待排資料;時間複雜度為O(n^2);穩定排序;
折半的概念來自於折半查詢
插入類排序的空間複雜度均為O(1).
3)希爾排序
定義,是一種縮小增量的排序;將待排序列分割為幾組,每次分割要基於一定的增量,每次的增量不一樣;在小組內排好序後,再進行下一次分組;
第一次分組,d=10/2=5
第二次分組,d=3



最後一趟的增量d=1;
平均時間複雜度為O(1.3),最壞時間複雜度為O(n^2);不穩定排序
空間複雜度:O(1)
希爾排序的C++實現:

int Shellsort(int A[],int length){
        int gap=0;
        int temp=0;
      for(gap=length/2;gap>0;gap/=2)
      {
            for(int i=gap;i<length;i++)
            {
             for (int j=i;j>=gap;j-=gap)
             {
               if(A[j]<A[j-gap])
               {
                 temp=A[j];
                 A[j]=A[j-gap];
                 A[j-gap]=temp;
               }
               else
               {
                 break;
               }  
             }
           }
         }
        return A;
}

說明:第二層j的值從i開始,每次跳到j-gap,且j的值大於等於gap,是因為當i往後移的時候,gap之前的數已經逐漸排好序了,後面j只需要控制在比較gap之後的元素即可。

2.交換排序:
1)氣泡排序
定義:從頭開始比較序列中的元素,每次保留較大(小)的數,直到一次迴圈結束,選出最大(小)數;
每一趟排序會將當前序列的最大(小)值放在其相應的位置上。從演算法就可以知道,執行兩層迴圈所需要的時間即為其時間複雜度;
最壞以及平均時間複雜度為O(n^2)
空間複雜度:O(1). 穩定排序
C++實現:
每一趟排序,當j和i相遇的時候,說明前i個值已經排好了,即已經將前i次每次找出的最小值放在相應位置上,所以j的值只需大於i即可:

int BubbleSort(int []A){
   int temp;
   for(int i=0;i<A.length();i++)
      {
         for(int j=A.length()-1; j>i; j--)
             {
                if(A[j]<A[j-1])
                {
                   temp=A[j];
                   A[j]=A[j-1];
                   A[j-1]=temp;
                  } 
              }
      }
    return A;
}    

2)快速排序
定義,從序列中選出一個數作為“樞軸”,通常會選擇第一個數,也可以選擇中間的數;在序列的首尾各有一個指標low、high,首先從high指向的數開始,與樞軸元素做比較,若遇到比樞軸小的元素,則將其挖出來放到low指向的位置;下一步則從當前low開始往後移動,若遇到比樞軸大的元素,將其挖出來放到當前high指向的位置;這樣經過一次移動完畢即low==high時,樞軸的左邊的數都比它小,其右邊的數都比它大。再對其左、右的子序列遞迴呼叫快排。
C++實現:

int QuickSort(int A[],int l,int r){
      int low=l;
      high=r;
      int pivot=A[low];       
      if(l<r)
         {
           while(low<high && pivot<=A[high])
           {
               high--;
               }
           if(low<high) A[low++]=A[high];          
           while(low<high && pivot>=A[low])
           {
             low++;
             }
           if(low<high){ 
            A[high--]=A[low];
           }     
         A[low]=pivot;
         QuickSort(A,int l,int low-1);
         QuickSort(A,int low+1,int r);         
    }
   return A;
 }                            

時間複雜度推導公式可以檢視相關資料,主要考慮其每次一分為二的特性。
快速排序的最好以及平均時間複雜度均為O(nlogn)
最壞時間複雜度為O(n2),對於快排,越有序的序列時間複雜度越高;
空間複雜度為O(logn)至O(n). 不穩定排序

3.選擇排序
1)簡單選擇排序
2)堆排序
堆排序;首先建立一個大頂或小頂堆;每次則可以找到最大或最小元素;將最大或最小元素與最後一個元素交換,接著繼續調整堆;
最壞時間複雜度O(nlogn),最好時間複雜度O(nlogn),平均時間複雜度O(nlogn);空間複雜度為O(1);

//調整堆中的元素時,假設沒有交換的子節點保持著最大(最小)堆性質,所以只對經過交換的子節點進行調整
void swap(int &a, int &b)
{
    int tmp = 0;
    tmp = a;
    a = b;
    b = tmp;

}
void ShiftHeap(int A[],int maxSign,int n)//maxSign為當前根節點,n表示n個節點;
{
    int j = 2 * maxSign + 1;
    int temp=A[maxSign];
    while (j < n)
    {
        if (j+1 < n && A[j] < A[j + 1])
        {
            j = j + 1;
        }
        if (temp > A[j])  break;
        else
        {
            A[maxSign] = A[j];
            maxSign = j;
            j = 2 * maxSign + 1;
        }
    }
    A[maxSign] = temp;
}

//正式開始堆排序,首先建立一個大頂或小頂堆,接著將頂端元素與最後一個元素交換,繼續進行交換後的調整;
void Heapsort(int A[],int n)
{
    for (int j = n / 2 - 1; j >= 0; j--)
    {
        ShiftHeap(A, j, n);
    }
    //交換過程:
    for (int i = n - 1; i >= 1; i--)
    {
        swap(A[i], A[0]);   
        ShiftHeap(A, 0, i);
    }
}

不得不說,每次只對度為2以上的節點進行調整,大大減少了時間複雜度,使其達到logn級別,真的hin棒了!
4.歸併排序
5.二叉樹排序

相關推薦

面試資料結構演算法總結

e最近開始投各種技術類的崗位,於是乎覺得必須補一下之前的資料結構演算法知識了,因為真的很重要!幾乎每家面試都會問到其中的幾個演算法。本文部分演算法是從其他大神博主那邊搬運的,大家可以搜尋相關演算法檢視其他大神的解說和思路~~~~ 穩定性:排序演算法是否穩定,根

筆試面試資料結構紅黑樹性質總結

紅黑樹 一、定義 紅黑樹是一種特定型別的二叉樹,是在電腦科學中用到的一種資料結構,典型的用途是實現關聯陣列。它是在1972年由RudolfBayer發明的,他稱之為"對稱二叉B樹",它現代的名字是在LeoJ.Guibas和RobertSedgewick於1978年寫的一篇論

機器學習(資料探勘)面試問題(知識點總結

應聘資料探勘工程師或機器學習工程師,面試官經常會考量面試者對SVM的理解。以下是我自己在準備面試過程中,基於個人理解,總結的一些SVM面試常考問題(想到會再更新),如有錯漏,請批評指正。(大神請忽視)轉載請註明出處:blog.csdn.net/szlcw1注:基於HOG-SVM演算法的行人檢測流程 見書21頁

面試:排序演算法2(希爾排序,歸併排序,堆排序)

希爾排序 O(N^d),最壞O(N^2),不穩定 void ShellSort(int A[],int N) { /*O(N^d),最壞O(N^2),不穩定*/ int Si,D,P,i; int tmp; int Sedgewick[]={929,505,209,109,41,

面試問的小演算法總結

圖的最短路徑演算法 Floyd最短路演算法 核心程式碼: for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(e[i

面試的常用資料結構演算法

資料結構與演算法,這個部分的內容其實是十分的龐大,要想都覆蓋到不太容易。在校學習階段我們可能需要對每種結構,每種演算法都學習,但是找工作筆試或者面試的時候,要在很短的時間內考察一個人這方面的能力,把每種結構和演算法都問一遍不太現實。所以,實際的情況是,企業一般考察一些看起來很基本的概念和演算法,或者是一些

九章演算法總結】Java 搞定連結串列-面試題目精選

面試大總結之連結串列CS3K.com一、OverView:連結串列是面試中常考的,本文參考了其它一些文章,加上小編的自己總結,基本每個演算法都測試並優化過。演算法大全(1)單鏈表 中還有一些連結串列題目,將來也會整理進來。這些題目雖然簡單,但如果能毫無BUG地寫出,定能讓面試官司對您印象分大增。小亮點是:主頁

面試資料結構Java實現

1、線性表 2、線性連結串列 3、棧 4、佇列 5、串 6、陣列 7、廣義表 8、樹和二叉樹 二叉樹:每個結點至多隻有兩棵子樹(即二叉樹中不存在度大於2的結點),並且,二叉樹的子樹有左右之分,其次序不能任意顛倒。 二叉樹的性質:   性質1:在二叉樹的第 

【經典】《Java170道面試試題全面含答案》涉及java/資料庫/Spring框架/JVM/資料結構演算法/設計模式相關

《Java170道面試筆試題全集》 -更新版-8.302018/4/7 日常修復2017/12/28 更新文章1、新增二級目錄2、對部分問題進行了補充9/24緊急修改以下問題(存在嚴重錯誤)問題3;完善問題10、11問題目錄:1、面向物件的特徵有哪些方面?2、訪問修飾符pub

面試演算法總結(二)

題目連結:試卷1和試卷2。 題目1:對於一個無序陣列A,請設計一個演算法,求出需要排序的最短子陣列的長度。給定一個整數陣列A及它的大小n,請返回最短子陣列的長度。 測試樣例: [1,5,3,4,2,6,7],7 返回:4 分析:1.先判斷依次最小值是否在正確位置,直到

筆試面試排序演算法總結

在筆試面試的過程中,常常會考察一下常見的幾種排序演算法,包括氣泡排序,插入排序,希爾排序,直接選擇排序,歸併排序,快速排序,堆排序等7種排序演算法,下面將分別進行講解。另外,我自己在學習這幾種演算法過程中,主要參考了MoreWindows Blog中的排序演算法

面試8種排序演算法總結

(1)插入排序 直接插入排序是一種較簡單的排序方法; 演算法思想: 將一個記錄插入到已排好的有序表中,從而得到一個新的記錄數加一的有序表; 示例:{3,45,66,97,1,6,65} 初始關鍵字 :

面試各類排序算法總結.(c#)

style index 存在 算法面試 變量 一位 選擇排序 直接插入 color 一. 面試以及考試過程中必會出現一道排序算法面試題,為了加深對排序算法的理解,在此我對各種排序算法做個總結歸納。 1.冒泡排序算法(BubbleSort) 1 public Class

java面試題目總結

幾個月的校招,終於面試可以面不改色,剛開始去面試的時候,每次問問題,以前學的東西都淡忘的差不多了,惡補基礎知識。下面是我總結的一些常考題目。 java和javac的作用:javac 是將java原始檔編譯為class位元組碼檔案,如javac HelloWorld.java。執行javac

資料結構演算法常見面試考題

(1) 紅黑樹的瞭解(平衡樹,二叉搜尋樹),使用場景 把資料結構上幾種樹集中的討論一下: 1.AVLtree 定義:最先發明的自平衡二叉查詢樹。在AVL樹中任何節點的兩個子樹的高度最大差別為一,所以它也被稱為高度平衡樹。查詢、插入和刪除在平均和最壞情況下都是O(log n)。增加

九章算法【總結】Java 搞定鏈表-面試題目精選

反轉 iterator 自己 最簡 middle 改變 刪除節點 listnode pri 面試大總結之鏈表CS3K.com一、OverView:鏈表是面試中常考的,本文參考了其它一些文章,加上小編的自己總結,基本每個算法都測試並優化過。算法大全(1)單鏈表 中還有一些鏈表

整理I 精選微軟等公司資料結構+演算法面試100題 第1-40題

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

整理III 微軟等資料結構+演算法面試100題 最新第61-80題

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

關於本微軟等公司資料結構+演算法面試100題系列的鄭重宣告

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

彙總I 精選微軟等公司資料結構+演算法面試100題 第1-60題彙總

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!