插入排序描述:有乙個陣列num[n];它有n個元素,假設其中n-1已經排好序了,那麼把剩餘的那個元素插入到合適的位置即可,這樣就完成了排序。根據這個思想,很明顯的可以使用遞迴來完成它。下面是遞迴版本的**.
#include using namespace std;
void insertionsort(int *num, int n);
int temp;
int main()
; //int num[10] = ;
insertionsort(num, 10);
for (int i = 0; i < 10; i++)
cout << endl;
system("pause");
}void insertionsort(int *num, int n)
else
num[i + 1] = temp;
break;}}
} else //已經排序好的序列中都比第n-1個大
num[0] = temp;
} }}
遞迴版本的插入排序,這個程式比較複雜,時間複雜度是ω(n³)的,因為那個雙層迴圈至少迭代n次,並且迴圈最大是o(n²)。這個遞迴版本寫起來也不好寫。因為陣列的插入時間複雜度就是o(n)。如果將陣列改成鍊錶,那麼陣列的插入這個操作的時間複雜度將會降低為o(1)。那麼採用迴圈實現的插入排序的時間複雜度就會降低為o(n²)。
void insertionsort1(int *num, int n) //迴圈方式
else //把小於要插入元素的值向後移動乙個位置,為插入工作做準備。
}}}
很明顯,迴圈實現的**時間複雜度只有o(n²)。
基於限位器版本的插入排序,它省略了j > 0的這個判斷操作。限位器加在了序列的最前面。在這裡就是num[0]。這個限位器保證了它不會超出陣列的範圍。
void insertionsort2(int *num, int n)
else //把陣列裡面的資料向後移動乙個位置。
}}}
插入排序在輸入的陣列是嚴格降序的情況下,(因為此處排序演算法是按照公升序排列的)該演算法出現最壞情況。但是時間複雜度仍然維持在o(n²)。但是該演算法對於基本按照公升序排列的輸入資料有著優秀的表現。(剛好和快速排序相反)這個優點使得它領先於同樣時間複雜度的選擇排序和氣泡排序。
值得一提的是,上面插入的過程中,可以將順序查詢改為二分查詢,但是這個改動僅對鍊錶有效,對於陣列而言,沒有用,因為即使找到位置變快了,但是移動的次數並不會減少。所以說演算法和資料結構是息息相關的。資料結構設計的好,演算法的效率也會得到提高。
基於插入排序,shell發明了希爾排序,希爾排序使用乙個增量序列h1,h2,...,ht。要求這個序列中h1必須等於1.在使用hk的一趟排序之後,對於每乙個i有num[i] <= num[i + hk]成立。所有相隔hk的元素都被排序。shell本人給出的增量序列是ht = n/2和hk = h(k+1)/2.(k,t是下標).根據這個策略實現的**如下。
#include "pch.h"
#include using namespace std;
void shellsort(int *num, int size);
int main()
; shellsort(num, 10);
for (int i = 0; i < 10; i++)
cout << endl;
system("pause");
}void shellsort(int * num, int size)
else
}num[j] = temp;
} }}
但是這個增量序列並不是足夠好。它的最壞情況是退化為插入排序。因此增量問題在於增量序列未必是互為質數。希爾排序看起來比較簡單。但是它的時間複雜度的分析時非常困難的。最壞情況下希爾排序為θ(n²)。
但是希爾排序的實際效能是可以接受的,即使面對很大的資料也是如此。在希爾排序中,增量序列的設計是困難的,它的好壞決定了希爾排序的快慢。(因為它的執行時間依賴於增量序列的選擇)
插入排序與希爾排序
插入排序是一種非常古老的排序思想,他的過程可以被形象的模擬出來 假設乙個人要摸起一副被打亂的撲克牌,我們注意到,剛開始時這個人手上並沒有牌,並且他每次只從牌堆中摸出一張牌,每當摸上一張牌時,他選擇從右向左 即從大到小 將這張牌與手中原有的牌進行比較,並最終將其插入到自己手牌中適合的位置,當牌堆中的牌...
插入排序 希爾插入排序
本文借鑑於lsgo實驗室創始人馬老師 演算法 希爾插入排序 delta len nums 2 while delta 0 shell delta,nums delta delta 2return nums defshell delta,key for i in range delta,len key...
插入排序 希爾排序
我們知道當乙個序列基本有序時,直接插入會變得很高效。因為此時只需少量的移動元素,操作集中在元素的比較上。基於這種想法,我們就試圖把乙個序列在進行直接插入前調整得盡量有序。這就是希爾排序 shell sort 的核心思路。shell只是演算法發明者的名字,無特殊含義 那到底該怎麼做呢?希爾排序一反以前...