前情摘要
現在我們學了一些基礎的資料結構,如鍊表,佇列,棧,等等。現在我們開始學習一些非常基礎的排序演算法。今天我們要講的是選擇排序,插入排序以及對插入排序的優化——希爾排序。
選擇排序
基礎原理:
比如說我們的輸入模型是有限的陣列,對陣列中的元素進行排序。對於選擇排序來說就是從該陣列中找出第乙個最小的元素和陣列中的第乙個元素交換。(如果陣列中的第乙個元素就是最小的,我們就讓它自己和自己交換)。然後在從陣列中剩下的元素中找出第二小的元素和陣列中的第二個元素進行交換。若干次之後我們就會得到乙個已經排好序的陣列。
動畫實現:
選擇排序
**實現
public
static
void
select_sort
(int
nums)
//找到最小元素。
}int temp = nums[i]
;//將最小元素與第乙個元素交換,將第二小的元素和第二個陣列中的元素進行交換。
nums[i]
= nums[min]
; nums[min]
= temp;
}}
複雜度分析
該**進行了n次交換和n2/2次比較。總的時間複雜度為o(n2)。
優點:交換次數很少,為線性時間,事實選擇排序演算法可能是所有演算法中交換元素次數最少的演算法。
缺點:浪費時間,和使用者輸入的模型無關,排序乙個有序的陣列和乙個隨機排序的陣列花費的時間一樣長。以後我們學習的演算法中更善於利用使用者資料的初始狀態,比如部分有序的陣列耗費時間將會短一點。
插入排序:
基礎原理:
我們假設陣列中的前p個元素已經有序,我們把第p+1元素作為待處理的元素,如果第p個元素大於第p+1個元素,我們遍把第p+1個元素插入到前面有序的部分,如果第p個元素小於第p+1個元素,則從0到第p+1個元素全都有序。以此類推,我們就能得到有序的陣列。一般我們讓p=1。
動畫實現:
插入排序
**實現
public
static
void
insert_sort
(int
nums)
nums[j +1]
= x;
//把待處理元素插入到合適的位置。
}}
時間複雜度分析;
平均時間複雜度:o(n2);
最優的時間複雜度:o(n);
插入排序對於待處理的陣列中的元素部分有序的演算法尤其適用。一般情況下,插入排序和選擇排序各有優缺點,但是插入排序的效果要比選擇排序的效率高。但是插入排序交換元素的次數較多。選擇排序演算法是所有排序演算法中交換元素次數最少的,線性階的演算法。接下來我們在講一下插入排序的改良版——希爾排序。
希爾排序:
希爾排序是插入排序的改良版,希爾排序也叫插入排序的大跨步版,插入排序每次只能走一格,但是希爾排序可以自由設定步數,使陣列中的元素形成部分有序的局面,然後在用插入排序演算法,這樣大大提高了插入排序的效率。
**實現:
public
static
void
shell_sort
(int
nums)
nums[j+step]
= x;
} step=step/3;
}}
就現在來說還沒有研究表明,什麼樣的間隔是最有效的,一般來說我們按照上圖中的間隔,上圖的間隔方法,取自演算法第四版。
希爾排序在某種情況下甚至比我們後面要講到的某些非常高效的演算法還要快。
好了,這就是初級排序方法之選擇排序和插入排序以及希爾排序的基本知識點了。以後我們會學習歸併排序。
本人良弓,初來乍到,請多關照~
Java排序演算法之氣泡排序 插入排序 選擇排序
一 前言 排序是日常中最常見的一種演算法,常見的演算法有 氣泡排序 插入排序 選擇排序 歸併排序 快速排序 計數排序 快速排序 基數排序 桶排序。那麼該怎樣分析和學習排序演算法呢?二 演算法的分析課 在上述的八種排序方法中,根據時間複雜度和是否基於比較可以為三種 排序演算法 時間複雜度 是否基於比較...
Java初級排序演算法 選擇排序 插入排序 希爾排序
package sort import edu.princeton.cs.algs4.in public class example private static boolean less comparable v,comparable w private static void exch comp...
研磨演算法 排序之初級排序(選擇 插入 冒泡)
標籤 空格分隔 研磨演算法 插入排序 氣泡排序 排序演算法是在基礎面試中經考到的演算法,也常常是我們解決問題的第一步。雖然在實際專案開發中很小幾率會需要我們手動實現,但是這些思想是我們需要學習的。本文將會剖析三種最出擊的排序演算法 選擇 插入 冒泡 選擇排序是最簡單直觀的一種演算法,之所以叫做選擇排...