图解选择排序与插入排序
上一篇詳述了冒泡排序及其優(yōu)化,有興趣的可以看看:
如何優(yōu)化冒泡排序?
一、選擇排序(SelectionSort)
- 算法思想:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再?gòu)氖S辔磁判蛟刂欣^續(xù)尋找最小(大)元素,然后放到已排序序列的末尾。以此類(lèi)推,直到所有元素均排序完畢。
- 排序過(guò)程:(默認(rèn)升序)
如圖所示,每一趟找到未排序的最小值,并放到有序序列的后面(即當(dāng)前趟對(duì)應(yīng)于數(shù)組中的第幾個(gè)元素)。
- java實(shí)現(xiàn)選擇排序:
????????if?(null?==?nums?||?nums.length?==?0)?{
????????????throw?new?RuntimeException("數(shù)組為null或長(zhǎng)度為0");
????????}
????????int?length?=?nums.length;
????????int?minValueIndex?=?0;
????????T?temp?=?null;
????????for?(int?i?=?0;?i?<?length?-?1;?i++)?{
????????????minValueIndex?=?i;
????????????for?(int?j?=?i?+?1;?j?<?length;?j++)?{
????????????????if?(nums[j].compareTo(nums[minValueIndex])?<?0)?{
????????????????????minValueIndex?=?j;
????????????????}
????????????}
????????????if?(minValueIndex?!=?i)?{
????????????????temp?=?nums[i];
????????????????nums[i]?=?nums[minValueIndex];
????????????????nums[minValueIndex]?=?temp;
????????????}
????????}
????}
復(fù)制代碼
- 時(shí)間、空間復(fù)雜度及穩(wěn)定性分析:
二、插入排序(InsertSort)
算法思想:通過(guò)構(gòu)建有序序列,對(duì)于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應(yīng)位置并插入。插入排序因而在從后向前掃描過(guò)程中,需要反復(fù)把已排序元素逐步向后挪位,為最新元素提供插入空間。
排序過(guò)程:(默認(rèn)升序)
InsertionSort 和打撲克牌時(shí),從牌桌上逐一拿起撲克牌,在手上排序的進(jìn)程相同。
舉例:
Input: {4, 3, 8, 5, 2, 6, 1, 7}。
首先拿起第一張牌, 手上有 {4}。
拿起第二張牌 3, 把 3insert 到手上的牌 {4}, 得到 {3 ,4}。
拿起第三張牌 8, 把 8 insert 到手上的牌 {3,4 }, 得到 {3 ,4,8}。
以此類(lèi)推。
插入排序由N-1趟排序組成。對(duì)于p=1到N-1趟排序后,插入排序保證從位置0到位置p上的元素為已排序狀態(tài)。即插入排序利用了從位置0到p-1位置上已經(jīng)有序的條件,將位置p上的元素向前查找適當(dāng)?shù)奈恢貌迦氪嗽亍?/strong>
如圖所示:在第p趟,我們將位置p上的元素向左移動(dòng),直到它在前p+1個(gè)元素(包括當(dāng)前位置的元素)中的正確位置被找到。
java實(shí)現(xiàn)插入排序
private?static?<T?extends?Comparable<??super?T>>?void?insertSort(T[]?nums)?{
??????if?(null?==?nums?||?nums.length?==?0)?{
??????????throw?new?RuntimeException("數(shù)組為null或長(zhǎng)度為0");
??????}
??????int?length?=?nums.length;
??????T?temp?=?null;
??????int?i?=?0;
??????for?(int?p?=?1;?p?<?length;?p++)?{
??????????temp?=?nums[p];
??????????for?(i?=?p;?i?>?0?&&?(temp.compareTo(nums[i?-?1])?<?0);?i--)?{
??????????????nums[i]?=?nums[i?-?1];
??????????}
??????????nums[i]?=?temp;
??????}
??}
復(fù)制代碼時(shí)間、空間復(fù)雜度及穩(wěn)定性分析:
三、總結(jié)
? 選擇排序的主要優(yōu)點(diǎn)與數(shù)據(jù)移動(dòng)有關(guān)。如果某個(gè)元素位于正確的最終位置上,則它不會(huì)被移動(dòng)。選擇排序每次交換一對(duì)元素,它們當(dāng)中至少有一個(gè)將被移到其最終位置上,因此對(duì)n個(gè)元素的表進(jìn)行排序總共進(jìn)行n-1次交換。在所有的完全依靠交換去移動(dòng)元素的排序方法中,選擇排序?qū)儆诜浅:玫囊环N。選擇排序最好、最壞時(shí)間復(fù)雜度都為O(n^2),空間復(fù)雜度為O(1),屬于不穩(wěn)定排序。
? 插入排序不適合對(duì)于數(shù)據(jù)量比較大的排序應(yīng)用。但是,如果需要排序的數(shù)據(jù)量很小,例如,量級(jí)小于千;或者若已知輸入元素大致上按照順序排列,那么插入排序還是一個(gè)不錯(cuò)的選擇。插入排序最好時(shí)間復(fù)雜度為O(n)、最壞時(shí)間復(fù)雜度為O(n^2),空間復(fù)雜度為O(1),屬于穩(wěn)定排序。
總結(jié)
以上是生活随笔為你收集整理的图解选择排序与插入排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 前端学习(3205):对state的理解
- 下一篇: React开发(127):引入icon的