《常見演算法和資料結構》元素排序(1)——簡單排序(附動畫)
元素排序(1)——簡單排序
本系列文章主要介紹常用的演算法和資料結構的知識,記錄的是《Algorithms I/II》課程的內容,採用的是“演算法(第4版)”這本紅寶書作為學習教材的,語言是java。這本書的名氣我不用多說吧?豆瓣評分9.4,我自己也認為是極好的學習演算法的書籍。
通過這系列文章,可以加深對資料結構和基本演算法的理解(個人認為比學校講的清晰多了),並加深對java的理解。
1.排序問題
排序問題在日常生活中非常常見,例如最簡單的,學生名單,就有多種排序,名字,成績,號碼,宿舍號……
問題是,我們如何對多種型別進行排序?
- 答案是——回撥函式。
它的實現思路很簡單: 我們呼叫系統的sort函式,系統根據需要通過回撥物件的CompareTo函式,對特定的物件進行排序。
1.1 回撥函式
在不同的語言中,有不同的實現回撥函式的方式,其中java使用的是Interfaces
1.2Java中回撥函式的路線圖
1.3 全序
設集合X上有一全序關係,如果我們把這種關係用 ≤ 表述,則下列陳述對於 X 中的所有 a, b 和 c 成立:
- 如果 a≤b 且 b≤a 則 a=b (反對稱性)
- 如果 a≤b 且 b≤c 則 a≤c (傳遞性)
- a≤b 或 b≤a (完全性)
注意: double 的 ≤ 不是全序
1.4 Comparable API
1.4.1 實現原則
- 必須是全序
- 小於,等於,大於分別返回負數(-1),0, 正數(1)
- 對於不相容的型別,丟擲異常
1.4.2 例子
2個比較有用的排序抽象 :
- 小於
- 交換
這兩個功能在排序上用處很多
2.選擇排序
2.1選擇排序思想(動畫)
選擇排序是很簡單的思想:
選擇最小的和第一個數交換,第二小的的跟第二個數交換……
2.2選擇排序的內部迴圈不變性
2.3選擇排序程式碼
public class Selection
{
public static void sort(Comparable[] a)
{
int N = a.length;
for (int i = 0; i < N; i++)
{
int min = i;
for (int j = i+1; j < N; j++)
if (less(a[j], a[min]))
min = j;
exch(a, i, min);
}
}
private static boolean less(Comparable v, Comparable w)
{
/* as before */
}
private static void exch(Comparable[] a, int i, int j)
{
/* as before */
}
}
3.插入排序
3.1插入排序思想(動畫)
插入排序演算法思想也很簡單:
每來一個數,把他插入到前面對應的位置,使得前面一直有序
3.2插入排序的內部迴圈不變性
3.3插入排序程式碼
public class Insertion
{
public static void sort(Comparable[] a)
{
int N = a.length;
for (int i = 0; i < N; i++)
for (int j = i; j > 0; j--)
if (less(a[j], a[j-1]))
exch(a, j, j-1);
else break;
}
private static boolean less(Comparable v, Comparable w)
{
/* as before */
}
private static void exch(Comparable[] a, int i, int j)
{
/* as before */
}
}
3.4 插入排序分析
插入排序最好的情況是比較N-1次0次交換,最壞的情況要N22次比較和N22次交換
插入排序對於部分有序的陣列效率挺高的,特別是對於小陣列
相關推薦
《常見演算法和資料結構》元素排序(1)——簡單排序(附動畫)
元素排序(1)——簡單排序 本系列文章主要介紹常用的演算法和資料結構的知識,記錄的是《Algorithms I/II》課程的內容,採用的是“演算法(第4版)”這本紅寶書作為學習教材的,語言是
《常見演算法和資料結構》優先佇列(3)——堆排序
堆排序 本系列文章主要介紹常用的演算法和資料結構的知識,記錄的是《Algorithms I/II》課程的內容,採用的是“演算法(第4版)”這本紅寶書作為學習教材的,語言是java。這本書的名
《常見演算法和資料結構》優先佇列(1)——API和初等實現
本系列文章主要介紹常用的演算法和資料結構的知識,記錄的是《Algorithms I/II》課程的內容,採用的是“演算法(第4版)”這本紅寶書作為學習教材的,語言是java。這本書的名氣我不用多說吧
《常見演算法和資料結構》優先佇列(2)——二叉堆
二叉堆 本系列文章主要介紹常用的演算法和資料結構的知識,記錄的是《Algorithms I/II》課程的內容,採用的是“演算法(第4版)”這本紅寶書作為學習教材的,語言是java。這本書的名
淺談演算法和資料結構: 五 優先順序佇列與堆排序
在很多應用中,我們通常需要按照優先順序情況對待處理物件進行處理,比如首先處理優先順序最高的物件,然後處理次高的物件。最簡單的一個例子就是,在手機上玩遊戲的時候,如果有來電,那麼系統應該優先處理打進來的電話。 在這種情況下,我們的資料結構應該提供兩個最基本的操作,一個是返回最高優先
《 常見演算法與資料結構》符號表ST(1)——基本介紹
符號表(Symbol Table) 本系列文章主要介紹常用的演算法和資料結構的知識,記錄的是《Algorithms I/II》課程的內容,採用的是“演算法(第4版)”這本紅寶書作為學習教材的,語言是java。這本書的名氣我不用多說吧?豆瓣評分9.4,我自
《 常見演算法與資料結構》平衡查詢樹(1)—— 2-3查詢樹(附動畫)
本系列文章主要介紹常用的演算法和資料結構的知識,記錄的是《Algorithms I/II》課程的內容,採用的是“演算法(第4版)”這本紅寶書作為學習教材的,語言是java。這本書的名氣我不用多說吧?豆瓣評分9.4,我自己也認為是極好的學習演算法的書籍。
演算法和資料結構 --- 八種必須掌握的排序
排序方法可以分為五種∶插入排序、選擇排序、交換排序、分配排序和歸併排序。 在排序過程中,全部記錄存放在記憶體,則稱為內排序,如果排序過程中需要使用外存,則稱為外排序。 首先來看一下八種排序之間的關係圖 1、 直接插入排序 (1)基本思想:
淺談演算法和資料結構: 四 快速排序
上篇文章介紹了時間複雜度為O(nlgn)的合併排序,本篇文章介紹時間複雜度同樣為O(nlgn)但是排序速度比合並排序更快的快速排序(Quick Sort)。 快速排序也是一種採用分治法解決問題的一個典型應用。在很多程式語言中,對陣列,列表進行的非穩定排序在內部實現中都使用的是快速排序。而且快速排序在
淺談演算法和資料結構: 三 合併排序
合併排序,顧名思義,就是通過將兩個有序的序列合併為一個大的有序的序列的方式來實現排序。合併排序是一種典型的分治演算法:首先將序列分為兩部分,然後對每一部分進行迴圈遞迴的排序,然後逐個將結果進行合併。 合併排序最大的優點是它的時間複雜度為O(nlgn),這個是我們之前的選擇排序和插入排序所達不到的。他還
淺談演算法和資料結構: 二 基本排序演算法
本篇開始學習排序演算法。排序與我們日常生活中息息相關,比如,我們要從電話簿中找到某個聯絡人首先會按照姓氏排序、買火車票會按照出發時間或者時長排序、買東西會按照銷量或者好評度排序、查詢檔案會按照修改時間排序等等。在計算機程式設計中,排序和查詢也是最基本的演算法,很多其他的演算法都是以排序演算法為基礎,在一般的資
《 常見演算法與資料結構》符號表ST(2)——初等實現分析和有序符號表
符號表(Symbol Table) (2) 本系列文章主要介紹常用的演算法和資料結構的知識,記錄的是《Algorithms I/II》課程的內容,採用的是“演算法(第4版)”這本紅寶書作為學習教材的,語言是java。這本書的名氣我不用多說吧?豆瓣評分9.
【面試心得】演算法和資料結構:查詢和排序
演算法和資料結構在面試中備受面試官的青睞,其中排序和查詢是面試中考察演算法的重點。 在準備面試的時候,我們應該重點掌握二分查詢、快速排序和歸併排序,做到能隨時正確、完整地寫出程式碼。 查詢和排序都是在程式設計中常用到的演算法。關於查詢演算法應該掌握:順序查詢、二分查詢、雜
常見java 和資料結構演算法 問題總結
本文為常見java面試筆試 題型 . 之後會不停的總結 ClassLoader Class.forName 裝載、連結、初始化 自動裝箱 運算子優先順序 assert斷言 三目運算子 型別轉換 異常 移位運算子 String synchronized wait not
Java實現一部分簡單的排序演算法和資料結構(學習筆記20171022002)
參考網路資料,複習用Java實現排序演算法:氣泡排序、直接選擇排序、直接插入排序、快速排序。資料結構:單鏈表、棧。 一眼就看明白的程式碼就把註釋省略了。 package sort; import java.lang.reflect.Array; import java.
查詢演算法 淺談演算法和資料結構: 七 二叉查詢樹 淺談演算法和資料結構: 十一 雜湊表
閱讀目錄 1. 順序查詢 2. 二分查詢 3. 插值查詢 4. 斐波那契查詢 5. 樹表查詢 6. 分塊查詢 7. 雜湊查詢 查詢是在大量的資訊中尋找一個特定的資訊元素,在計算機應用中,查詢是常用的基本運算,例如編譯程式中符號表的查詢。本文
拒絕調包俠,不需要高階演算法和資料結構技巧
前言 大多數工科學生或者剛剛入門近年來比較火的“人工智慧”相關演算法的同學,在選擇語言的時候,都會選擇MATLAB、Python、R等等這些高階語言,對自己所學的演算法進行實現和除錯。這些高階語言中,包含了實現複雜演算法的基礎數學演算法、基本統計演算法、基礎資料結構的實現,比如均值(mean)、方差(std
java中各種演算法和資料結構的使用場景
一。通用資料結構:陣列,連結串列,樹,雜湊表 通用資料結構通過關鍵字的值來儲存並查詢資料,如報表,合同,記錄,業績等資料。通用資料結構可以用速度的快慢來分類,陣列和連結串列是最慢的,樹相對較快,雜湊表是最快的。請注意,並不是最快的就一定是最好的,因為最快的結構的
淺談演算法和資料結構: 八 平衡查詢樹之2-3樹
前面介紹了二叉查詢樹(Binary Search Tree),他對於大多數情況下的查詢和插入在效率上來說是沒有問題的,但是他在最差的情況下效率比較低。本文及後面文章介紹的平衡查詢樹的資料結構能夠保證在最差的情況下也能達到lgN的效率,要實現這一目標我們需要保證樹在插入完成之後
淺談演算法和資料結構: 九 平衡查詢樹之紅黑樹
前面一篇文章介紹了2-3查詢樹,可以看到,2-3查詢樹能保證在插入元素之後能保持樹的平衡狀態,最壞情況下即所有的子節點都是2-node,樹的高度為lgN,從而保證了最壞情況下的時間複雜度。但是2-3樹實現起來比較複雜,本文介紹一種簡單實現2-3樹的資料結構,即紅黑樹(