筆面試常考資料結構演算法總結
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 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!