排序算法:
- 插入排序
- 直接插入排序
- 希爾排序
- 交換排序
- 冒泡排序
- 快速排序
- 選擇排序
- 直接選擇排序
- 樹形選擇排序
- 堆排序
- 歸併排序
- 基數排序
- 多關鍵字排序
- 鏈式基數排序
查找算法:
- 靜態查找
- 順序查找
- 二分查找
- 分塊查找
- 動態查找
- 二叉排序樹
- 平衡二叉樹
- B-樹和B+樹
- 紅黑樹
- 哈希表查找
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1、直接插入排序
簡介:n個數據,從1到n一個一個插入進行排序。
空間複雜度:O(1)
時間複雜度:O(n2)
算法穩定性:穩定算法
2、希爾排序
簡介:取幾個增量,如5,2,1(最後一個增量必須爲1),然後從左到右5個5個的排序(如:1到5數據排序,然後2到6數據排序),最後重複操作按2個,1個進行排序。
空間複雜度:O(1)
時間複雜度:O(nlog2n)
算法穩定性:不穩定算法
3、冒泡排序
簡介:從第一個數據開始兩兩比較,直到在一趟兩兩比較中沒有發生交換,排序結束
空間複雜度:O(1)
時間複雜度:O(n2)
算法穩定性:穩定算法
4、快速排序
感謝:MoreWindows
代碼:
public void quick_sort(int[]s,int l,int r){
if(l<r){
int i=l,j=r,x=s[l];
while(i<j){
while(i<j&&s[j]>x) j--;//從後面找
if(i<j) s[i++] = s[j];
while(i<j&&s[i]<=x) i++;//從前面找
if(i<j) s[j--] = s[i];
}
}
s[i]=x;
quick_sort(s,l,i-1);
quick_sort(s,i+1,r);
}
簡介:先從數列中取出一個數作爲基準數;分區過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊;再對左右區間重複第二步,直到各區間只有一個數
空間複雜度:O(n)
時間複雜度:O(nlog2n)
算法穩定性:不穩定算法
5、直接選擇排序
簡介:每一趟從待排序列中取關鍵字最小的記錄,下一趟取n-1個記錄中最小的記錄
空間複雜度:O(1)
時間複雜度:O(n2)
算法穩定性:不穩定算法
6、歸併排序
感謝:MoreWindows
簡介:通過遞歸將待排序數組分成只有一個一個的數組,再把相鄰的數組合並(類似快排的分治法)。
小的在左邊,大的在右邊,遍歷完之後就成了一個一個的數組(已經有序了),直接合並就是了,但是必須實時更新原數組的序列。
空間複雜度:O(n)
時間複雜度:O(nlog2n)
算法穩定性:穩定算法
7、排序算法總結
8、查找算法總結
1.二分查找需要有序表;
2.B+樹和B-樹:B+樹是B-樹的變體,搜索關鍵字時,B+只有到達葉子結點才能命中(終點命中),B-樹可以在非葉子結點命中(任意位置命中),性能接近二分查找;
3.Hash函數要解決問題:優秀的Hash函數,解決衝突。
4.優秀的Hash函數可以避免很多衝突,但不能解決衝突,不能因爲函數的複雜性而犧牲Hash查找的性能,所以需要有很好的衝突解決辦法,只要有衝突就會涉及到查找,數據量大沖突就多,查找的時間就長,Hash查找性能降低。