1.要求2n個數的中位數,採用分治策略。每次劃分後,都會去掉一半的數,只剩原來一半的數。
遞推關係式為:t(n)=t(n/2)+o(1),由master定理,可得時間複雜度為o(logn)。
#include
#include
#define n 1000000
using
namespace
std;
int a[n],b[n];
int i,n;
int getmin(int x,int y)//比較得到較小的數
int getmax(int x,int y)//比較得到較大的數
double getmedian(int arr,int n)//得到中位數
else
return (arr[(n/2)-1]+arr[n/2])/2.0;
}double calmedian(int a,int b,int n)
m1=getmedian(a,n);
m2=getmedian(b,n);
if (m1==m2)//若兩個陣列中位數相等,直接返回m1
return m1;
if (m1//若m1
else
}int main()
printf("\n請輸入第二個陣列的值:");
for (i=0;icin>>b[i];
}printf("\n兩個陣列的中位數是:");
cout
0;}
2.要求逆序數,採用分治策略。每次劃分後,都會去掉一半的數。總逆序數=左半邊逆序數+右半邊逆序+兩半邊分別排序後的逆序數。 若需要排序a[p…q],則可以對半分成a[p…r]和a[r…q],然後將這有序的兩部分合併。合併過程的時間複雜度為o(n)。
遞推關係式為:t(n)=2t(n/2)+o(n),由master定理,可得時間複雜度
為o(nlogn)。
#include
#include
#define n 1000000
using
namespace
std;
int a[n],l[n],r[n],temp[n];
int i,n;
int mergesort(int a,int low,int high)
for (i=mi+1;i<=high;i++)
int ret=0;
int k=low;
i=0,j=0;
while(i//兩個指標掃瞄比較大小,歸併排序
}while(i//處理剩餘的數
while(jreturn ret;
}int calreverseorder(int a,int low,int high)//計算逆序數
int mi=(low+high)/2;
ans+=calreverseorder(a,low,mi);//計算(low,mi)範圍內的逆序數
ans+=calreverseorder(a,mi+1,high);//計算(mi+1,high)範圍內的逆序數
ans+=mergesort(a,low,high);//再加上歸併排序後增加的逆序數
return ans;
}int main()
printf("\n逆序對的個數是:");
cout
<0,n-1)0;}
分治演算法 簡單了解
部分內容來自 感謝原作者!這種將整個問題分解為若干個小問題來處理的方法稱為分治法。被分解出來的小問題與原問題有相同的解法,這樣便於演算法的計算 往往採用遞迴 分治法的控制流程 a 判斷是否滿足最小處理條件,或者說滿足了最小規模函式,然後進行處理,或者返回。有的可能沒有 b 如果沒有滿足最小規模,那麼...
分治演算法 入門簡單例項
求最大值和最小值,相信再簡單不過了,只要乙個迴圈遍歷,然後每次比較最大的和最小的值,然後遍歷完後就得到了最大值和最小值了。就是先排序,然後最大值和最小值就是頭尾了。這裡用分治法來求最大值和最小值了。如下 include stdio.h int aa void get max min int s,in...
簡單演算法的應用
include stdio.h 折半查詢 int searchitem int array,int len,int key int main int argc,char const ar long len sizeof array sizeof int int location searchitem...