選擇排序、冒泡排序、合并排序、快速排序、插入排序的算法思想和實(shí)現(xiàn),以及時(shí)間復(fù)雜度比較。 以下排序算法均沒(méi)有進(jìn)行優(yōu)化,而是采用最符合原始算法思想的方式進(jìn)行實(shí)現(xiàn)和比較。 選擇排序的思想與算法實(shí)現(xiàn): 找出待排序的數(shù)列中的最小(或最大)元素,與待排序的數(shù)列的隊(duì)首元素進(jìn)行交換,隊(duì)首元素并入已排序數(shù)列,直至待排數(shù)列的所有元素均已排完。
T(n) = an2 + bn + c 平均情況:O(n2) 冒泡排序的思想與算法實(shí)現(xiàn): 按順序訪問(wèn)待排序的數(shù)列,一次比較兩個(gè)相鄰元素,如果他們的大小關(guān)系不對(duì)就交換他們的值,遍歷一趟待排數(shù)列便會(huì)把待排數(shù)列中的最大(或最小值)移動(dòng)到隊(duì)末,將該最值并入已排數(shù)列,重復(fù)訪問(wèn)待排序直至待排數(shù)列中的元素均已排完。
T(n) = an2 + bn + c 平均情況:O(n2) 合并排序的思想與算法實(shí)現(xiàn): 將無(wú)序的數(shù)列分成兩個(gè)無(wú)序子序列,再將所有無(wú)序子序列各分成兩個(gè)無(wú)序子序列,直至所有子序列只含一個(gè)元素;將子序列合并成有序數(shù)列,相當(dāng)于先分解再求解再合并。 合并操作需要?jiǎng)?chuàng)建或傳遞一個(gè)大小等于兩個(gè)待合并序列之和的空序列,將兩個(gè)待排子序列的隊(duì)首元素進(jìn)行比較,將較小的元素按順序賦值給空序列,如果有一個(gè)子序列的元素全部賦值完,便將另一個(gè)子序列的所有值按順序賦值給空序列。
T(n) = 2T(n/2)+O(n)遞推 = nlogn 平均情況:O(nlogn) 快速排序的思想與算法實(shí)現(xiàn): 將隊(duì)首元素視為key,比key小的值移動(dòng)到左邊,比key大的值移動(dòng)到右邊,完成后以key為分界線將序列分成兩個(gè)子序列,每個(gè)子序列再重復(fù)進(jìn)行上訴操作直至排序完成,相當(dāng)于先求部分解再分解。
T(n) = 2T(n/2)+O(n)遞推=aT(n/b)+D(n)+C(n) = nlogn + n 平均情況:O(nlogn) 插入排序的思想與算法實(shí)現(xiàn): 從第二個(gè)元素開(kāi)始,逆序與左邊的元素依次做比較,直到遇到不比它大的元素,便將其插入到該元素后面,再?gòu)牡谌齻€(gè)元素開(kāi)始循環(huán),直至最后一個(gè)元素完成插入。
T(n) = an2 + bn + c 平均情況:O(n2) 實(shí)際測(cè)試時(shí)間復(fù)雜度:快速排序 < 合并排序 < 插入排序< 選擇排序< 冒泡排序。 win10+visual studio2015環(huán)境測(cè)試,int型數(shù)組 數(shù)組大小為10000-50000(縱坐標(biāo)為時(shí)間單位us,表示所消耗的時(shí)間) 其中快速排序比合并排序快: 合并排序和快速排序都需要進(jìn)行遞歸函數(shù)調(diào)用,但合并排序需要?jiǎng)?chuàng)建數(shù)組空間進(jìn)行合并操作,快速排序只需在初始數(shù)組中進(jìn)行交換賦值,所以合并排序的耗時(shí)比快速排序多。 數(shù)組大小為100、1000、10000、100000、100000。 |
|
來(lái)自: 醉人說(shuō)夢(mèng) > 《Java》