一、插入排序(撲克牌原理) n^2 原址
a[1,...,n-1]是排好序的,把第n個往前
二、分治法(歸併) nlgn 非原址
//先分解
sort(a,p,r)
if pa++;//or b++;
三、分治法--最大子陣列問題
描述:尋找a的和最大的非空連續子陣列
解決:按中點分成兩段,遞迴找左右段各自的最大段,再找跨越中點的最大段,三個結果進行比較
find(a,low,high)
if high==low
return(low,high,a[low])
else mid=[(low+high)/2]
(l-low,l-high,l-sum)=find(a,low,mid)
(r-low,r-high,r-sum)=find(a,mid+1,high)
(c-low,c-high,c-sum)=cross-find(a,low,mid,high)
choose the max one to return
cross-find(a,low,mid,high)//這是跨中點段
left_sum=max
sum=0
for i=mid:low
sum+=a[i]
if(sum>left_sum)
left_sum=sum
max_left=i
right_sum=max
sum=0
for i=mid+1:high
sum+=a[i]
if(sum>right_sum)
right_sum=sum
max_right=i
return(max_left,max_right,left_sum+right_sum)
四、矩陣乘法的strassen演算法
描述:axb按照原始的乘法需要遞迴三層,現在:
把矩陣分解成n/2 x n/2 的形式:a11,a12,a21,a22,b11,b12,b21,b22;
再將其兩兩加or減 得10個矩陣s1,s2,...,s10:
s1=b12-b22 s2=a11+a12 s3=a21+a22 s4=b21-b11 s5=a11+a22
s6=b11+b22 s7=a12-a22 s8=b21+b22 s9=a11-a21 s10=b11+b12
再遞迴的計算7次乘法。。。。。。
五、隨機演算法(優先順序 原址)
1. a[1...n],給每乙個數分配乙個優先順序,p[i]=random(1,n^3);使用p各個數的大小對a進行排序//問:若產生的優先數相等怎麼辦?--對其再進行隨機數賦值
2. 原址排列給定數列;a[i]是從i--n數中隨機選取乙個j,swap(i,j),然後不再改變
六、堆排序 nlgn 非原址
二叉堆--被近似地看成完全二叉樹;分為最大堆、最小堆;;建堆,維護堆,由堆對乙個陣列進行原址排序。
//對left[i],right[i]滿足最大堆,而a[i]不一定大於孩子的維護
max_heapify(a,i)
//建堆
build_max_heap(a)
//用堆排序
heapsort(a)
//取出最大的元素 並維護堆
heap_extract_max(a)
//在建好的堆中位置i插入key
heap_increase_key(a,i,key)
九、基數排序
描述:按最低有效位排序,合併後再按次低有效位排序,......;一位數排序演算法最好是選取穩定的(計數常用)
十、桶排序
描述:把乙個區間劃分成幾等分,各用乙個list,然後落在各區間裡的數分別排序,再把他們合併。
要求:元素服從均勻分布,平均情況下的時間代價為o(n)
十一、遺忘比較交換演算法--列排序演算法
描述:不依賴待排序元素的值,也不依賴之前比較的結果(0,1排序引理可證之);
包含n個元素的矩形陣列的排序,有r行xs列,滿足:
r必須是偶數;s|r;r>=2*s^2;
得到的結果是列優先有序的,從上到下,從左到右 單增。
十二、中位數和統計量
1.同時求最大/最小值--最多3[n/2]次
描述:總數為奇則把最大最小值的初始值設為first元素,為偶則取前兩個比較後設為最大最小初值;剩餘的數每兩個相互比較,較小的再與min比,較大的再與max比。
2.同時求最大數和次大數
描述:把所有數兩兩配對取較大值,再次兩兩配對取較大值,...,最後得出的數為最大數;而次大數再從最大數開始回過去找,取最大值公升上來的每個線路結點的孩子一一比較,最後得出次大值。
3.用快排找第i大的元素--期望為線性時間的選擇演算法
描述:只處理單邊的快排
randomized_select(a,p,r,i)
4.最壞情況為線性時間的選擇演算法
描述:返回n>1時的第i小的元素;n=1時返回唯一值;
select(a,p,r,i)
1.將n個元素劃分為[n/5]組,每組5個,剩餘元素為一組
2.尋找每一組的中位數;先用插入排序,然後取中位數;得b[k]
3.對得到的中位數們遞迴呼叫select(b,0,k,k/2),返回值為x,它記錄了中位數的中位數;
4.利用快排修改過的partition(a,p,r,x),以x為主元對整個陣列進行劃分,然後得出x的位置在q標處
5.若i=q,則返回x;若iq,則遞迴呼叫select(a,q+1,r,i-q)。
演算法 基礎知識
插入排序法示例 將想要插入的值搜尋找到合適的位置,之前的數值一一向後移動乙個位置,騰出乙個空位置給想要插入的數值。偽 instert sort a for j 2 to a.length key a j i j 1 while i 0 and a i key a i 1 a i i i 1 a i ...
演算法基礎知識
o 1 稱為不變複雜性 1項 1秒 10項 1秒 100個專案 1秒 專案的數量仍然增加10倍,但o 1 的比例因子總是1。o log n 稱為對數複雜度 1項 1秒 10項 2秒 100項 3秒 1000項 4秒 10000項 5秒 計算次數只會增加輸入值的對數。因此,在這種情況下,假定每個計算需...
演算法筆記 演算法基礎知識
演算法是一種解決某類問題 具體的 明確無歧義的計算過程。十進位制的指數。例如 1500 1.5 10 3 數量級是3,也可以是 千 kilo 150萬 1.5 10 6 數量級是6,也可以是 百萬 million 150萬比1500大3個數量級 執行環境資源有限,需要根據輸入規模 數量級 準備資源,...