交換排序(exchange sort)
選擇排序(select sort)
歸併排序
其它排序
其它操作
今年資料結構課設最後一道題要寫好幾種不同排序演算法的效率比較,所以今天就先來做一下排序演算法的功課。基本概念:
主、次關鍵碼
排序演算法的穩定性
內、外排序
時間開銷:資料比較次數、資料移動次數
靜、動態排序
演算法執行的附加儲存
對乙個資料表直接進行排序的幾個基本方法(以增序為例)。
直接插入排序(insert sort)
基本思想:從前向後遍歷資料表,遍歷到第i個資料時,前i-1個資料是乙個已經排序好的序列。直接檢測i應該放在什麼位置,插入,然後移動資料就行。
void
insertsort
(datalist& list)
}void
insert
(datalist &list,
int i)
}
演算法分析:
時間複雜度o(n
2)
o(n^2)
o(n2)
折半插入排序(binary insert sort)
基本思想:和直接插入排序的區別是,直接插入排序時找符合條件的元素位置依靠的是順序搜尋。折半插入排序是對分查詢。
void
binaryinsertsort
(datalist& list)
}void
binaryinsert
(datalist& list,
int i)
else
}//left==right==insert-position
element temp = list[i]
;for
(int k=i-
1;k>=left;k--
) list[left]
= temp;
}
演算法分析:
時間複雜度o(n
log2n
)o(n\log_2n)
o(nlog2
n)鍊錶插入排序
基本思想:前面兩種直接插入的方式的實現都依靠連續儲存的動態陣列。鍊錶插入排序靠鍊錶儲存每乙個資料成員。因此只能順序檢測。
具體方法:定義乙個頭節點,value=min_int,link指向1號元素,1號元素(鍊錶尾節點)link指向頭節點。遍歷整個鍊錶,把每個元素慢慢插入到鍊錶中。檢測到i號元素時,由原先的i-1號元素link域找到頭節點,從頭節點開始檢測哪個位置的元素的值大於i號元素。應定義乙個current指標指向該元素的前乙個元素,便於插入操作。
希爾排序
基本思想:該方法的又稱為縮小增量排序。該方法的基本方法是:設待排序物件序列有 n 個物件。首先取乙個整數 gap < n 作為間隔,將全部物件分為 gap 個子序列,所有距離為 個子序列,所有距離為 gap 的物件放在同乙個子串行中,在每乙個子串行中分別施行直接插入排序。然後縮小間隔gap,例如取gap = gap/2,重複上述的子串行劃分和排序工作。直到最後取 gap == 1,將所有物件放在同乙個序列中排序為止。
演算法分析:
根據統計學得出的演算法複雜度o(n
1.25
)o(n^)
o(n1.2
5)~o
(1.6
n1.25
)o(1.6n^)
o(1.6n
1.25
)氣泡排序(bubble sort)
基本思想:每次迴圈通過兩兩比較,大者後移小者前置,找出前n(n-1,n-2,…)項的最大項放到數列的末端。如此迴圈n-1次,就能排序完全。
快速排序(quick sort)
基本思想:任選乙個數(可以選亂序的第乙個元素)作為快排標準,比它小的數放在它前面,比它大的數放在它後面。這樣就產生了兩個子串行,然後遞迴對這兩個子串行進行快速排序,直到子串行為空。
優化:(1)選擇快排標準的時候,如果不小心選中了最小/最大數,就會使排序方法退化。因此可以多選幾個數求平均值。(2)可以用棧儲存子串行的開始、結束索引,用棧代替遞迴的辦法。
void
quicksort()
}swap
(datalist[standardtarget]
,datalist[begin]);
//把standard放到正確位置上
//更新棧
qsrange.
push
(quicksortrange
(begin,standardtarget-1)
);qsrange.
push
(quicksortrange
(standardtarget+
1,end));
}}
直接選擇排序(select sort)
基本思想:用乙個int儲存前n(n-1,n-2,…)個元素中的最大數,然後和當前檢查的最後乙個元素交換位置。
堆排序(heap sort)
基本思想:用前2
m2^m
2m個數構建乙個堆,然後用siftdown()把它變成最大堆。最大堆構造完成後,把根節點的元素和最後乙個元素位置交換(把最大元素置於陣列最後),然後堆的範圍縮小1,從根節點開始用siftup()再次構造最大堆。重複上述步驟直到堆的大小只剩下1。
錦標賽排序
基本思想:從n個數的序列中任意選擇前2
m2^m
2m個數字,把他們的索引作為一棵二叉樹的葉節點構造樹。然後從底層開始比較,父結點等於比較小的數的索引,一直比較到根節點,找出最小的數,放到新序列的第一位。然後根據索引,用下乙個元素代替它,這時候只需要和父結點比較,大者上移動就可以。第一次比較需要m-1次,後來每次加入新元素比較只需要log
2(m)
log_2(m)
log2(
m)次(即樹的高度)。
兩路歸併排序(merge sort)
基本思想:兩個含有n(1,2,3,…)個元素的有序序列相互比較組合成乙個大的有序序列。
基數排序(radix sort)
基本思想:基數排序有兩種:(1)低位優先(2)高位優先。兩種方法不太一樣,但是思想是一樣的。就是通過比較對應位上的數字大小(個位、十位、百位等),然後進行排序。
桶排序(bucket sort)
基本思想:把資料集劃分成m個範圍(桶)。檢查n個元素,然後放到各個符合範圍條件的桶中,桶之間是有序的。遞迴縮小桶範圍,最後就能得到有序序列。
#include
#include
srand
(unsigned
int seed)
;//提供種子
srand((
unsigned
int)
(time
(null))
);//種子由當前時間決定 所以得到不一樣的數字
rand()
;//根據srand的種子產生隨機數
實現效果:chaoszh_github_2018datastructure
常見排序演算法思想
穩定的排序演算法有 1.氣泡排序 將小的數往前挪,將大的數往後挪。2.插入排序 移動第i 1的那個數,在此數之前的序列中,從後往前進行比較相鄰的兩個數,將更小的數放前面,保證每次第i 1個之前的子串行有序。3.歸併排序 利用分治的思想,將乙個無序的陣列分解若干以兩個數為一組的子陣列,然後將每個子陣列...
演算法 1 五種常見的演算法思想簡述
遞迴 遞迴演算法是把問題轉化為規模縮小了的同類問題的子問題。然後遞迴呼叫 函式 或過程 來表示問題的解。暴力 暴力求解就是根據問題的描述和定義直接求解,不使用特殊的演算法。動態規劃 動態規劃演算法通常用於求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每乙個解都對應於乙個值,我們希望找...
常見的演算法思想
把乙個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題,直到最後子問題小到可以簡單的直接求解,原問題的解即子問題的解的合併。這個技巧是很多高效演算法的基礎,如排序演算法 快速排序,歸併排序 傅利葉變換 快速傅利葉變換 大資料中的mr,現實中如漢諾塔遊戲。分治法對問題有一定的要...