原创 二分查找法與二分搜索樹
使用前提:有序數列 迭代版本: template<typename T> int binarySearch(T arr[],int n,int target){ int l=0,r=n-1; while(l<=r
原创 (三)幾種排序算法的學習總結(快速排序)
快速排序:“二十世紀最偉大的算法” 核心思想:每次從數組中選擇一個元素作爲基點,之後把該元素移動到排好序時應該所處的位置,使得基點之前的元素都小於它、之後的元素都大於它。之後對小於它、大於它的子數組分別遞歸進行快速排序 將元素
原创 Euclid(歐幾里得)算法
import java.util.Scanner; public class Euclid { /* * 歐幾里得(Euclid)算法: * 計算兩個非負整數p和q的最大公約數 * 1.若q是0,則最大公約數爲p
原创 素數判定
import java.util.Scanner; public class IsPrime { /* * 判斷一個數是否爲素數 */ public static boolean isPrime(int N){ if
原创 最小生成樹——Lazy Prim
/* 背景知識: 切分(Cut):把圖中的節點分爲兩部分,成爲一個切分 橫切邊: 一個邊的兩個端點分別屬於切分Cut的不同兩邊 ,稱該邊爲橫切邊(Crossing Edge) 切分定理: 給定任意切分,橫切邊中權值最小的邊一定屬於最小
原创 圖的實現
稀疏圖(SparseGraph)——鄰接表稠密圖(DenseGraph)——鄰接矩陣#include<iostream> #include<assert> #include<vector> using namespace std; cl
原创 (二)幾種排序算法的學習總結(歸併排序)
(三)歸併排序 歸併排序核心思想:將數組的元素不斷二分(N個元素就有logN個層級),再向上歸併(時間複雜度爲O(n))(遞歸)。 途徑:開闢一塊相同大小的臨時空間進行操作,使用三個索引分別表示:歸併過程中跟蹤的位置(k),兩個
原创 堆排序實現
Heapify: 基本思想:將一個完全二叉樹所有的葉子節點先分別都視爲一個最大堆,然後對第一個非葉子結點進行shiftDown操作,使得該節點和它的葉子節點構成一個最大堆。依次對第二、三個非葉子節點進行同樣的操作,直到整個堆變成
原创 並查集——路徑壓縮
關於Rank的優化 上文中我們已經對代碼進行了幾次優化,使得進行連接操作的時候,所形成的樹長度儘量短,但同時也存在另一種情況:集合元素多,但是每個元素分別指向根節點,這樣就只有兩層(舉例),那麼就應該把這棵樹的根節點指向另一棵高樹的根
原创 HDU 2031進制轉換
第一次寫博客,有點小緊張 一開始覺得真的這題摸不着頭緒,後來上網學習了一下,發現還是有類似模板的 原題如下: 進制轉換 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65
原创 堆的思想及實現
堆: 1.任意節點小於(或大於)它的所有後裔,最小元(或最大元)在堆的根上(堆序性)。 2.堆總是一棵完全樹。 完全樹:即除了最底層,其他層的節點都被元素填滿,且最底層儘可能地從左到右填入。 將根節點最大的堆叫
原创 二叉樹 的 存儲與基本操作實現
數據結構課程學了二叉樹,覺得自己大概理解了,但是實現還是總有困難,尤其是結構體指針這塊,吃了不少虧 (一)存儲與遍歷(遞歸) #include<algorithm> #include<cstdlib> #include<cstdio>
原创 圖——連通分量與深度優先遍歷
#ifndef INC_05_DFS_AND_COMPONENTS_COMPONENTS_H #define INC_05_DFS_AND_COMPONENTS_COMPONENTS_H #include<iostream> #incl
原创 (一)幾種排序算法的學習總結(選擇排序與插入排序)
(一)選擇排序 選擇排序:在每次循環中找出最小的元素,將其移至開頭,第二次找出次小元素,將其移至第二位,以此類推 算法複雜度:O(n*n) //泛型函數模板 template<typename T> void selection
原创 相鄰節點迭代器
#ifndef INC_02_GRAPH_REPRESENTATION_SPARSEGRAPH_H #define INC_02_GRAPH_REPRESENTATION_SPARSEGRAPH_H #include<iostream