插入排序的思想:插入排序的思想有點類似摸撲克牌,首先抽取第一張,當做已經排好序,然後第二張,插入到已經排好序的撲克牌中,依次類推,第三張...直到最後一張。
void insertsort(int arr,int len)
arr[j] = tmp;
tmp = arr[i];}}
}}
分析:插入排序比氣泡排序快。
在陣列基本有序的情況下比選擇排序好。
簡單排序比較:
氣泡排序基本不用,太慢;
選擇排序基本不用,不穩定;
插入排序在數量小且基本有序的情況下優先選擇。
下面介紹一下改進的插入排序:希爾排序
希爾排序的思想:根據乙個陣列的長度取乙個間隔n,每間隔n個數取乙個值,在陣列中取一組數,對這一組數用插入排序排列。直到全排列。然後再縮小這個間隔,變為n/2或者其他比n小的間隔,然後每隔新的間隔取一組數,再次對這組數排列,直到全排列,一直縮小n,直到n變為1,再對全數進行一次插入排序,就得到了最終的結果。
分析:缺點:希爾排序不穩定。
優點:間隔n比較大的時候,移動的次數少。並且經過大間隔數的排序後,小的數靠前了,大的數靠後了。
間隔小的時候,移動的距離比較短。兩者結合,總的移動的次數會比單純的插入排序的次數少。
第一種取間隔的方式:n->n/2->n/4....1
void shellsort(int arr,int len)}}
}}
第二種取間隔的方式:
knuth序列
h=1h=3*h+1
1,4,13,....
根據knuth序列和陣列的長度,確定乙個最大的間隔h,然後依次遞減到1.
void shellsort(int arr,int len)
for(int gap = h;gap > 0;gap = (gap-1)/3)}}
}}
十大排序演算法 插入排序
原理 就好比我們打撲克排的抓牌階段,我們一般拿到一張新的排會與前面的牌進行比較,然後放到合適的位置,即每次抓到牌後預設前面的牌已經全部排好序。將第一待排序序列第乙個元素看做乙個有序序列,把第二個元素到最後乙個元素當成是未排序序列。從頭到尾依次掃瞄未排序序列,將掃瞄到的每個元素插入有序序列的適當位置。...
十大排序演算法(二)插入排序
前言 插入排序也叫 插牌法 排序 演算法 1tmp記錄第n個元素,並將第n個元素設為空位 n 1 2依次用前n個元素 和tmp比較 如果tmp比他們小,將他插入此位置,此時空位前移,再重複迴圈之至比到第乙個位置 核心 k標記位置 tmp儲存元素 a j 1 a j 元素前移 時間複雜度 最好o n ...
十大排序 直接插入排序
直接插入排序 空間複雜度o 1 時間複雜度最好情況是o n 最壞情況是o n 平均情況是o n 是穩定的內排序演算法 從後往前比較,把後面的元素作為哨兵 includeusing namespace std includevoid insertionsort vector q else q j 1 ...