程序员必知8大排序3大查找(一)
每天都在叫囂自己會什么技術,什么框架,可否意識到你每天都在被這些新名詞、新技術所迷惑,.NET、XML等等技術固然誘人,可是如果自己的基礎不扎實,就像是在云里霧里行走一樣,只能看到眼前,不能看到更遠的地方。這些新鮮的技術掩蓋了許多底層的原理,要想真正的學習技術還是走下云端,扎扎實實的把基礎知識學好,有了這些基礎,要掌握那些新技術也就很容易了。
?
要編寫出優(yōu)秀的代碼同樣要扎實的基礎,如果排序和查找算法學的不好,怎么對程序的性能進行優(yōu)化?廢話不多說,本文要介紹的這些排序算法就是基礎中的基礎,程序員必知!
?
1、直接插入排序
?
(1)基本思想:在要排序的一組數(shù)中,假設前面(n-1) [n>=2] 個數(shù)已經(jīng)是排
好順序的,現(xiàn)在要把第n個數(shù)插到前面的有序數(shù)中,使得這n個數(shù)
也是排好順序的。如此反復循環(huán),直到全部排好順序。
(2)實例
?
?
2、希爾排序(也稱最小增量排序)
?
(1)基本思想:算法先將要排序的一組數(shù)按某個增量d(n/2,n為要排序數(shù)的個數(shù))分成若干組,每組中記錄的下標相差d.對每組中全部元素進行直接插入排序,然后再用一個較小的增量(d/2)對它進行分組,在每組中再進行直接插入排序。當增量減到1時,進行直接插入排序后,排序完成。
(2)實例:
?
?
3、簡單選擇排序
?
(1)基本思想:在要排序的一組數(shù)中,選出最小的一個數(shù)與第一個位置的數(shù)交換;
然后在剩下的數(shù)當中再找最小的與第二個位置的數(shù)交換,如此循環(huán)到倒數(shù)第二個數(shù)和最后一個數(shù)比較為止。
(2)實例:
?
?
4、堆排序
?
(1)基本思想:堆排序是一種樹形選擇排序,是對直接選擇排序的有效改進。
堆的定義如下:具有n個元素的序列(h1,h2,...,hn),當且僅當滿足(hi>=h2i,hi>=2i+1)或(hi<=h2i,hi<=2i+1)(i=1,2,...,n/2)時稱之為堆。在這里只討論滿足前者條件的堆。由堆的定義可以看出,堆頂元素(即第一個元素)必為最大項(大頂堆)。完全二叉樹可以很直觀地表示堆的結(jié)構(gòu)。堆頂為根,其它為左子樹、右子樹。初始時把要排序的數(shù)的序列看作是一棵順序存儲的二叉樹,調(diào)整它們的存儲序,使之成為一個堆,這時堆的根節(jié)點的數(shù)最大。然后將根節(jié)點與堆的最后一個節(jié)點交換。然后對前面(n-1)個數(shù)重新調(diào)整使之成為堆。依此類推,直到只有兩個節(jié)點的堆,并對它們作交換,最后得到有n個節(jié)點的有序序列。從算法描述來看,堆排序需要兩個過程,一是建立堆,二是堆頂與堆的最后一個元素交換位置。所以堆排序有兩個函數(shù)組成。一是建堆的滲透函數(shù),二是反復調(diào)用滲透函數(shù)實現(xiàn)排序的函數(shù)。
(2)實例:
初始序列:46,79,56,38,40,84
建堆:
?
交換,從堆中踢出最大數(shù)
剩余結(jié)點再建堆,再交換踢出最大數(shù)
?
依次類推:最后堆中剩余的最后兩個結(jié)點交換,踢出一個,排序完成。
?
5、冒泡排序
?
(1)基本思想:在要排序的一組數(shù)中,對當前還未排好序的范圍內(nèi)的全部數(shù),自上而下對相鄰的兩個數(shù)依次進行比較和調(diào)整,讓較大的數(shù)往下沉,較小的往上冒。即:每當兩相鄰的數(shù)比較后發(fā)現(xiàn)它們的排序與排序要求相反時,就將它們互換。
(2)實例:
?
?
未完,后續(xù)接著寫另外3大排序,還有3大查找……
轉(zhuǎn)載于:https://www.cnblogs.com/spring5/archive/2012/05/04/2485236.html
總結(jié)
以上是生活随笔為你收集整理的程序员必知8大排序3大查找(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS 删除 cookie
- 下一篇: PJzhang:英国通信总部GCHQ开源