演算法之初級排序

2021-08-28 11:32:09 字數 1221 閱讀 8167

講排序之前先來幾個簡單的函式:

交換函式:

public static void swap(comparable a, int i, int j)
小於函式:

public static boolean less(comparable v, comparable w)
首先找到陣列中的最小元素,將它和陣列的第乙個元素交換位置;再次,在剩下的元素中找到最小元素,將它和陣列的第二個元素交換位置。如此往復,直到整個陣列排序。 核心思想:不斷的選擇剩餘元素之中的最小值。

public class selectsort

swap(a, i, min);}}

}

思想:越大的元素會經由交換慢慢「浮」到數列的頂端(公升序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣。

public class bubble        }}

}

通常我們整理橋牌,是將每一張牌插入到其他已經有序的牌中的適當位置。

與選擇排序一樣,當前索引左邊的所以元素都是有序的,但它們的最終位置還不確定,為了給最小元素騰出空間,它們可能會被移動。當索引到達陣列的右端時,陣列排序就完成了。

和選擇排序的不同是,插入排序所需的時間取決於輸入中元素的初始順序。

public class insertion}}

}

希爾排序為了加快速度簡單改進了插入排序,交換不相鄰的元素以對陣列的區域性排序,並最終用插入排序將區域性有序的陣列排序。

思想:使陣列中任意間隔為 h 的元素都是有序的。相對於插入排序,只需要在插入排序的**中移動元素的距離由 1 改為 h 即可。

public class shell

}h = h/3;}}

}

子陣列部分有序的程度取決於遞增序列的選擇,而如何選擇遞增序列呢?回答這個問題不簡單,但上圖的演算法效能,執行時間達不到平方級別。在最壞的情況下,其比較次數和n3/2 成正比。 

總結:對於中等大小的陣列它的執行時間是可以接受的,它的**量小,且不需要額外的記憶體空間。下面的幾節有更高效的演算法,對於很大的n,它們可能只會比希爾排序快倆倍(可能還達不到),而且更複雜。如果你需要解決乙個排序問題而又沒有系統排序函式可用,可以先用希爾排序,然後再考慮是否值得將它替換為更加複雜的排序演算法。

演算法之初級排序

將整個集合中最小的元素放置到集合最前面位置,繼續在剩下的集合中找到最小的元素放到剩下集合的最前面位置。一直迴圈重複這個步驟,直到整個集合有序。附加動畫 將當前元素插入到子集合中合適的位置。第一步從集合第乙個位置開始,遍歷到集合結束。當前元素為當前遍歷位 置的元素。子集合是指整個集合開始位置與當前遍歷...

研磨演算法 排序之初級排序(選擇 插入 冒泡)

標籤 空格分隔 研磨演算法 插入排序 氣泡排序 排序演算法是在基礎面試中經考到的演算法,也常常是我們解決問題的第一步。雖然在實際專案開發中很小幾率會需要我們手動實現,但是這些思想是我們需要學習的。本文將會剖析三種最出擊的排序演算法 選擇 插入 冒泡 選擇排序是最簡單直觀的一種演算法,之所以叫做選擇排...

初級排序演算法

回顧之前學習的各種排序演算法,從初級到高階,包括選擇排序,氣泡排序,插入排序,希爾排序,快速排序,歸併排序,堆排序等等,持續更新中 注 這裡實現的演算法都是遞增排序,也就是從小到大排序。思想 首先,找到陣列中最小的那個元素,其次,將它和陣列的第乙個元素交換位置 如果第乙個元素就是最小元素那麼它就和自...