原创 二分查找法與二分搜索樹

使用前提:有序數列 迭代版本: 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