一些總結的比較好的部落格
1. 排序學習筆記
2. 部分排序方法的整理
1 外層迴圈將排序好的除去
2 內層迴圈將沒排好的陣列進行前後比較大小,每經過乙個迴圈,最大的數都在最後面
穩定排序,時間複雜度o(n2)
void
bubblesort
(vector<
int>
&arr)
//第一層下來最大的值已經冒泡到最上面的部分
return
;}
先找到第乙個數後的最小值,並將其與之交換(內層迴圈為找到最小值)
穩定,o(n2)
void
selecttsort
(vector<
int>
&arr)
swap
(arr,i,min);}
return
;}
1 外層迴圈是將排好續的陣列保留
2 內層迴圈是將拿到的陣列進行插入
可以是穩定的,o(n2)
//版本一
void
insertsort1
(vector<
int>
&arr)
}return;}
//版本二
/*** 直接插入排序,先挪位置直接插入
* */
void sort::
insertsort2
(vector<
int>
&arr)
}
遞迴分治
第一步: 將其劃分兩個區域 partition
第二分布: 左邊遞迴,右邊遞迴
可以做到穩定 o(nlogn)
void
quicksort
(int left,
int right)
//最終將基準數歸位
a[left]
= a[i]
; a[i]
= temp;
quicksort
(left, i-1)
;//繼續處理左邊的,這裡是乙個遞迴的過程
quicksort
(i+1
, right)
;//繼續處理右邊的 ,這裡是乙個遞迴的過程
}
排序成 左邊小,中間相等,右邊大的情況
第一步,利用兩個指標,乙個指向小的部分,乙個指向大的部分
第二部分,當前指標遍歷陣列,如果小魚目標值將起放到左邊,大於放到右邊,否則移動下標
快排的一部分,三路快排問題,不穩定 o(nlogn),
第一步:建立大根堆,當前節點的大於父節點時,將其與之交換,向上調整
第二步:將0位置的數與最後的位數交換,即根節點與尾節點交換
第三步:做heapify向下調整:找到當前節點與左右子節點的最大值,交換後向下延伸
不穩定排序 o(n)
void
push_down
(vector<
int>
&heap,
int size,
int u)
return;}
void
push_up
(vector<
int>
&heap,
int u)
return;}
void
heap_sort
(vector<
int>
&heap)
while
(n) heap.
erase
(heap.
begin()
);return
;}
第一步:找到中點
第二步 : 遞迴左右子陣列
第三步: 合併:此時分為三部分,先理好一遍沒有的,再理好一邊有的
穩定 o(nlogn)
void
merge_module
(vector<
int>
&nums,
int l,
int r)
while
(i <= mid) tmp.
push_back
(nums[i++])
;while
(j <= r) tmp.
push_back
(nums[j++])
;for
(i = l, j =
0; i <= r;
++i,
++j) nums[i]
= tmp[j]
;return;}
void
merge_sort
(vector<
int>
&nums)
排序演算法筆記
1 直接插入排序 on 2,穩定的 將最左邊的作為乙個有序數列 設立哨兵,比較並插入已形成的有序數列中。2 希爾排序 時效不好分析,不穩定 直接插入排序的公升級版,調整不同的增量d 2 縮小增量排序,3 快速排序的思想是分治思想 概括來就是在分治的過程中,每次以最後乙個元素為基準,兩個index指向...
演算法筆記 排序
o nlogn 比如 5,8,5,2,9 選擇排序演算法排序,第一次找到最小元素 2,與第乙個 5 交換位置,那第乙個 5 和中間的 5 順序就變了,所以不穩定 比如序列 6,8,7,6,3,5,9,4,在經過第一次分割槽操作之後,兩個 6 的相對先後順序就會改變 include include i...
演算法筆記 排序演算法 插入排序
插入排序的方法就類似於 在鬥地主發牌時,一張張牌地拿起並插入到自己手中的牌堆中。假設陣列 arr 有n個無序元素。每一次的插入就是在區間 0,i 中找到 arr i 1 對應的位置並插入。0,i 就相當於我們手中牌堆,arr i 1 就相當於下一張要插入的牌。直到沒有下乙個要插入的數,該陣列就變得有...