玩轉演算法與資料結構 C 描述 插入排序

2021-09-24 08:06:31 字數 1815 閱讀 4434

2-5 插入排序 insertion sort

整理撲克牌的思想

看後面的牌,插入到前面合適的位置

#inlcude #inlcude #include "sorttesthelper.h"

#include "selectionsort.h"

using namespace std;

templatevoid insertsort(t arr, int n)else

}//可以看到,插入排序可以break出去,減少步驟。

//這段for也可以簡化為:

for(int i=1; i0 && arr[j] < arr[j-1]; j--)

}}int main()

namespace sorttesthelper

}

得到:

插入排序0.3s,選擇排序0.19s

為什麼插入排序還慢了?下面學一種優化,

還學一種性質,它會使插入排序的效能不比nlogn的排序效果差

2-6 插入排序發的改進

現在實現的版本,遍歷的同時也在不停地交換,交換非常耗時,

因為交換要3次操作,陣列還需要訪問index所在位置的時間,

試試能不能讓內圈for,只做一次swap?

先把元素複製乙個副本,然後不斷看它與前面元素比較,是否適合放在某個位置,直到真正確定它的位置。不必每次都去swap

改進:

templatevoid insertionsort(t arr, int n)

arr[j] = e; //找到合適位置,放進去

}}

這回,消耗時變成了0.15s

這個效果還是不夠明顯,

現在在sorttesthelper中新增乙個generatenearlyorderedarray()

先生存乙個完全有序的陣列,然後隨機挑出幾個進行交換。

namespace sorttesthelper{

int *generatenearlyorderedarray(int n, int swaptimes){

int *arr = new int[n];

for(int i=0; i這樣,

int *arr = sorttesthelper::generatenearlyorderarray(n,100);

只有100個是無序的,

此時插入排序的時間是0.004s,遠遠超過選擇排序

這個速度甚至比nlogn還要快,所以它是有實際意義的,因為很多時候要排序的元素就是近似有序的,

比如日誌,只存在某幾個出問題的是無序的,就可以用插入排序,

當完全有序時,插入排序的時間複雜度是o(n)級別,只有外層循壞,

所以插入排序會在更複雜額排序演算法中作為子模組,

2-7 o(n^2)排序演算法的思考

selection sort,任何情況下都是很慢的,

insertion sort,在近乎有序時,插入排序效能比nlogn還高

bulle sort,

多數學校的語言學習,1st排序演算法就是氣泡排序,

這節深入的理解下氣泡排序,

它整體沒有插入排序好,後面應該不會用它,github上有它的**和對他的改進

插入排序是重點,它可以引申出非常重要的排序:shell sort 希爾排序

它嘗試每次和前面第h個元素進行比較,通過將很大的h逐漸變成1,。。。。。。

讓它的時間複雜度有了質變

github有改進的實現

希爾排序是非常使用的方法,雖然比nlogn高一些

我們的學習不是簡單的實現演算法,而是優化它,深入理解它,有更深刻的認識

資料結構與演算法描述

資料結構是資料元素相互之間的關係,是相互之間存在一種或多種特定關係的資料元素的集合。乙個資料結構包含了以下三個方面的內容 資料元素之間的邏輯關係,也就是邏輯結構 就是給人看的 能畫出來的 資料元素及其關係在計算機記憶體中的表示,成為資料的儲存結構 就是給計算機看的 具體實現相關的 資料的運算和實現,...

資料結構與演算法分析 C語言描述

第一種方法,先進行排序,再返回位置k上的元素。簡單排序問題 第二種方法,先將前k個元素讀入,再將剩下的元素逐個讀入,如果新元素大於陣列中第k個元素就找到他合適的位置並將陣列中的乙個元素擠出。第三種方法,利用快排的特點 假設預設公升序排序 每一次快排操作都能確定乙個數在排序結果中的最終固定位置,即該位...

資料結構與演算法分析 c 語言描述

編寫帶有下列宣告的兩個例程 void permute string str void permute char str,int low,int high 第乙個例程是個驅動程式,它呼叫第二個例程並顯示string str中字元的所有排列。例如,str是 abc 那麼輸出的串則是abc,acb,bac...