直接插入排序,也是很常見的演算法,每本資料結構的書上應該都有這個演算法,如果沒有,你就扔了這本書吧,換一本吧
直接插入排序,為什麼取這個名字?
直接插入排序取這個名字,也是很容易理解的,每次都是取出乙個元素,插入前面已經排好序的元素中,重複上述的步驟,直至整個序列變成有序序列。
直接插入排序的演算法思路:
1:將陣列中的第乙個元素當做有序序列,這時的有序序列中只有乙個元素
2:將第二個元素插入到前面的有序序列,最終的結果仍然是乙個有序序列,此時序列為長度為2個元素
3:將第三個元素插入到前面的有序序列中,最終結果仍然是乙個有序序列,序列長度為3個元素
4:對後面的元素做同樣的操作,第n-1次插入後,陣列將變成有序序列。
時間複雜度
最壞情況下,假設是從小到大排序,此時陣列是乙個逆序序列,則總共需要(說明不帶哨兵情況下,且不計算越界操作時)(n-1)*n/2,需要的移動操作為(n-1)*n/2+(n-1)次,最好的情況下是序列已經牌有序的情況下,此時的比較次數為n-1次,移動的次數為0次,因此平均的時間複雜度為o(n^2)
空間複雜度:
演算法的空間複雜度,因為需要乙個元素做為交換,故需要o(1)
演算法的穩定性
直接插入排序演算法,因為將元素插入到有序序列時是從有序序列的最後乙個位置向前尋找插入位置的,因些演算法是穩定的。
不帶哨兵的直接插入排序
void insertsort(int *a ,int n)
}
帶哨兵的直接插入排序
//假設a中第乙個元素當做哨兵,即a[0]
void insertsort(int *a ,int n)
}
寫好最簡單的氣泡排序
氣泡排序,真的很簡單,不是嘛,如果給你15分鐘,也許你會很快就寫出來乙個,真的,我相信你,而且說不定考慮的還是相當周全滴,在此僅以此部落格記錄一下,我所認識的氣泡排序。氣泡排序,為什麼取這個名?你可以想想池塘裡的氣泡,從最底部向最上部浮起的過程,是不是由小變大的過程中,這是乙個物理知識,就不用說了吧...
寫好最簡單的氣泡排序
氣泡排序,真的很簡單,不是嘛,如果給你15分鐘,也許你會很快就寫出來乙個,真的,我相信你,而且說不定考慮的還是相當周全滴,在此僅以此部落格記錄一下,我所認識的氣泡排序。氣泡排序,為什麼取這個名?你可以想想池塘裡的氣泡,從最底部向最上部浮起的過程,是不是由小變大的過程中,這是乙個物理知識,就不用說了吧...
寫好最簡單的選擇排序
選擇排序,所有排序演算法中最簡單的乙個,不是嘛,如果有哪本程式設計書中沒有直接或者間接的含有這個演算法,真的換一本吧 在此僅以此部落格記錄一下,我所認識的選擇排序。選擇排序,為什麼取這個名?之所以叫選擇排序,是因為每次都是要從剩餘的序列中選擇乙個最大 最小 的元素將其放在最終位置 有序時元素所在的位...