1:時間複雜度:分析關鍵字比較次數和記錄的移動次數;
2:空間複雜度:需要的輔助記憶體;
3:穩定性:相同的關鍵字計算後,次序是否不變。
直接插入排序
(insertionsort)
的基本思想是:
每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子串行中的適當位置,直到全部記錄插入完成為止。例如
int a=new int
一般設陣列為
a[0…n-1]
。1.
初始時,
a[0]自成1
個有序區,無序區為
a[1..n-1]
。令i=1
2.
將a[i]
併入當前的有序區
a[0…i-1]
中形成a[0…i]
的有序區間。
3. i++
並重複第二步直到
i==n-1
。排序完成。
先for
迴圈n-1
次,插入資料,,跟前面的乙個個比較。。
如果a[j]
前乙個資料
a[j-1] > a[j]
,就交換
a[j]
和a[j-1],再
j--
直到a[j-1]<= a[j
]。這樣也可以實現將乙個新資料新併入到有序區間。
//從小到大直接插入排序方法
public static void insertsort(seqlistseqlist)}}
}
思路:第一次從r[0]~r[n-1]中選取最小值,與r[0]交換,第二次從r~r[n-1]中選取最小值,與r[1]交換,...., 第i次從r[i-1]~r[n-1]中選取最小值,與r[i-1]交換,.....,第n-1次從r[n-2]~r[n-1]中選取最小值,與r[n-2]交換,總共通過n-1次,得到乙個按排序碼從小到大排列的有序序列。
1、設陣列
內存放了
n個待排數字,陣列下標從
1開始,到
n結束。
2、初始化
i=13
、從陣列的第i
個元素開始到第
n個元素,
尋找最小的元素。
4、將上一步
找到的最小元素和第
i位元素交換。5
、i++,
直到i=n-1
演算法結束,否則回到第3步
//從小到大簡單選擇排序方法
public static void ******selectsort(seqlistseqlist)
seqlist[low] = seqlist[high]; //將比tmp小的放在前面,low位置
while ((low < high) &&(seqlist[low] <= tmp)) //前面比tmp小的不動
seqlist [high ]=seqlist [low ]; //將比tmp大的放在後面,high位置
//知道此時 low=high
}seqlist[high] = seqlist[low] = tmp;//此時low=high ,就完成了以tmp值來分界
//分別對前後兩部分來 快速排序
if(i < low - 1) //對tmp前面的數(0到low-1)遞迴呼叫,,此時【low】==tmp,low=high
if(low + 1 < j) //對tmp後面的數(low+1到j)遞迴呼叫,,此時【low】==tmp,low=high
}
在程式設計相關領域,堆(heap)的概念主要涉及到兩個方面:
本文所說的堆,指的是前者。
堆排序演算法是基於完全二叉樹的排序演算法,把一顆完全二叉樹調整為堆,時間複雜度是o(nlgn)
,與快速排序達到相同的時間複雜度。但是
在實際應用中,我們往往採用快速排序而不是堆排序。
這是因為快速排序的乙個好的實現,往往比堆排序具有更好的表現。
堆排序的主要用途,是在形成和處理優先順序佇列方面
。另外,如果計算要求是類優先順序佇列(比如,只要返回最大或者最小元素,只有有限的插入要求等),堆同樣是很適合的資料結構。
二叉堆是完全二叉樹或者是近似完全二叉樹。
二叉堆滿足二個特性:
1.父結點的鍵值總是大於或等於(小於或等於)任何乙個子節點的鍵值。
2.每個結點的左子樹和右子樹都是乙個二叉堆(都是最大堆或最小堆)。
當父結點的鍵值總是大於或等於任何乙個子節點的鍵值時為最大堆。當父結點的鍵值總是小於或等於任何乙個子節點的鍵值時為最小堆。下圖展示乙個最小堆:
一般都用陣列來表示堆,i結點的父結點下標就為(i – 1) / 2。它的左右子結點下標分別為2 * i + 1和2 * i + 2。如第0個結點左右子結點下標分別為1和2。
堆排序演算法的
基本思想
是,將陣列a建立為乙個最大堆,然後交換堆的根(最大元素)和最後乙個葉節點x,將x從堆中去掉形成新的堆a1,然後重複以上動作,直到堆中只有乙個節點。
主要是二路歸併排序,基本思想是:
將兩個有序表合併為乙個有序表。(n個數為n個長度為1的表,合併為n/2個長度為2的表,以此類推,最終生成1個長度為n的表)
該演算法是採用
分治法(
divide and conquer
將大化小,將複雜歸為簡單
)的乙個非常典型的應用。
分治法的精髓:(
是很多高效演算法的基礎,如
排序演算法
(快速排序
,歸併排序
),傅利葉變換(
快速傅利葉變換))
分--將問題分解為規模更小的子問題;
治--將這些規模更小的子問題逐個擊破;
合--將已解決的子問題合併,最終得出「母」問題的解;
歸併排序的效率是比較高的,設數列長為n,將數列分開成小數列一共要logn步,每步都是乙個合併有序數列的過程,時間複雜度可以記為o(n),故一共為
o(n*logn)。
因為歸併排序每次都是在相鄰的資料中進行操作,所以歸併排序在o(n*logn)的幾種排序方法(快速排序,歸併排序,希爾排序,堆排序)也是效率比較高的。也是
穩定的排序演算法。
與前面的排序演算法(通過關鍵碼的比較和移動來排序)完全不同,基數排序是一種借助於多關鍵碼排序的思想,是將單關鍵碼按基數分成多關鍵碼進行排序的方法,是一種分配排序。
基數排序只適合於字串和整數這種有明顯結構特徵的關鍵碼。
它是怎麼排序的呢?我們可以按照下面的一組數字做出說明:12、 104、 13、 7、 9
(1)按個位數排序是12、13、104、7、9
(2)再根據十位排序104、7、9、12、13
(3)再根據百位排序7、9、12、13、104
這裡注意,如果在某一位的數字相同,那麼排序結果要根據上一輪的陣列確定,舉個例子來說:07和09在十分位都是0,但是上一輪排序的時候09是排在07後面的;同樣舉乙個例子,12和13在十分位都是1,但是由於上一輪12是排在13前面,所以在十分位排序的時候,12也要排在13前面。
所以,一般來說,10基數排序的演算法應該是這樣的
(1)判斷資料在各位的大小,排列資料;
(2)根據1的結果,判斷資料在十分位的大小,排列資料。如果資料在這個位置的餘數相同,那麼資料之間的順序根據上一輪的排列順序確定;
(3)依次類推,繼續判斷資料在百分位、千分位......上面的資料重新排序,直到所有的資料在某一分位上資料都為0。
分治演算法排序(C 版)
分治排序 把乙個陣列分成兩個陣列,然後在把這兩個陣列再各自分成兩個陣列,直到陣列有兩個數,然後比較這兩個數,並且合併,排序。就是上面這個樣子 的。不說了上 c 版 name 分治演算法 time 15 8 9 14 25 environment ubuntu 14.04,sublime text 3...
排序演算法筆記(C 版)
記錄最近學習的一些排序演算法 注 第乙個演算法給出了完整的測試程式,其餘的為避免重複及節省空間,只顯示排序演算法部分 執行結果的程式耗時每次執行略有不同,僅供大致對比參考 時間複雜度 o n 最好 o n2 平均 o n2 最差 空間複雜度 o 1 include include 計時用 using...
C 版 常用排序演算法。
1 個人學習記錄。2 大佬請繞道。using system.collections using system.collections.generic using unityengine namespace datastructure.wcc region 穩定排序 歸併排序 氣泡排序 插入排序。re...