锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鍏充簬浜屽弶鏍?br> 鐜板湪鏈?/span>N涓厓绱犵殑鏁扮粍鎴栬呴摼琛紝瑕佹煡鎵句竴涓厓绱犲繀欏婚亶鍘嗘暟緇勭洿鍒版壘鍒板厓绱犮傚亣濡傚厓绱犲湪鏄暟緇勪腑鏈鍚庝竴涓垨鑰呮暟緇勪腑涓嶅瓨鍦ㄨ繖鏍風(fēng)殑鍏冪礌錛岄偅涔堝緢涓嶅垢錛屾垜浠閬嶅巻鏁翠釜鏁扮粍銆傚鏋?/span>N闈炲父澶э紝閭e皢鏄潪甯哥棝鑻︾殑涓浠朵簨鎯呫?br>鐢ㄤ簩鍙夋爲(wèi)鎯呭喌灝卞ソ澶氫簡錛?br>1錛?nbsp;鏇村揩鐨勬煡鎵?br>2錛?nbsp;澧炲姞鍏冪礌鏃訛紝鍏冪礌琚嚜鍔ㄦ帓鍒?br>鍘熺悊錛?/em> 鍦ㄤ簩鍙夋爲(wèi)涓儏鍐典笉澶竴鏍蜂簡 鍚庡簭閬嶅巻錛?/span> 浠?/font>1,2,3,4,5,6,7,8,9灝嗗緱鍒?br> 棣栧厛瑕佹壘鍒拌鍒犻櫎鐨勫厓绱?/span>E錛屾湁涓ょ鏂規(guī)硶錛?br>1錛?nbsp;閫氳繃閬嶅巻鎵懼埌榪欎釜鍏冪礌E 閫氳繃鍑芥暟鍥炶皟 閬嶅巻浜屽弶鏍?/span> 綆鑰岃█涔嬶紝鍥炶皟鍑芥暟灝辨槸涓涓氳繃鍑芥暟鎸囬拡璋冪敤鐨勫嚱鏁般傚鏋滀綘鎶婂嚱鏁扮殑鎸囬拡錛堝湴鍧錛変綔涓哄弬鏁頒紶閫掔粰鍙︿竴涓嚱鏁幫紝褰撹繖涓寚閽堣鐢ㄤ負(fù)璋冪敤瀹冩墍鎸囧悜鐨勫嚱鏁版椂錛屾垜浠氨璇磋繖鏄洖璋冨嚱鏁般?br>鍙互鎶婅皟鐢ㄨ呬笌琚皟鐢ㄨ呭垎寮銆傝皟鐢ㄨ呬笉鍏沖績璋佹槸琚皟鐢ㄨ咃紝鎵鏈夊畠闇鐭ラ亾鐨勶紝鍙槸瀛樺湪涓涓叿鏈夋煇縐嶇壒瀹氬師鍨嬨佹煇浜涢檺鍒舵潯浠訛紙濡傝繑鍥炲間負(fù)int錛夌殑琚皟鐢ㄥ嚱鏁般?br>
鍦ㄩ摼琛ㄦ垨鏁扮粍涓紝鍏冪礌涓涓帴鐫涓涓紝濡傚浘
姣忎釜鍏冪礌榪炵潃涓や釜鍏冪礌錛屽乏瀛╁瓙鍜屽彸瀛╁瓙銆備粬浠瓨鍌ㄧ殑鍊肩殑鍏崇郴鏈夊涓嬭瀹?br>Value錛?/span>left錛?/span><Value錛?/span>middle錛?/span><=Value錛?/span>right錛?br>
鎺掑簭錛?br>鍦ㄤ簩鍙夋爲(wèi)涓埄鐢ㄩ掑綊浣犺兘寰堟柟渚跨殑鎺掑簭
鍓嶅簭閬嶅巻
PrintElement(pTopMostElement)
.
.
void PrintElement(TreeElement* pElement)
{
if (pElement)
{
PrintElement(pElement->LeftChild)
pElement->PrintMe()
PrintElement(pElement->RightChild)
}
}
PrintElementReversed(pTopMostElement)
.
.
void PrintElementReversed(TreeElement* pElement)
{
if (pElement)
{
PrintElementReversed(pElement->RightChild)
pElement->PrintMe()
PrintElementReversed(pElement->LeftChild)
}
}
濡備綍浣夸簩鍙夋爲(wèi)騫寵 錛?/em>
娣誨姞鍏冪礌鐨勯『搴忓皢褰卞搷浜屽弶鏍?wèi)鐨勫舰鎬侊紝浠?/span>3,6,4,8,1,9,2,7,5鐨勯『搴忓緱鍒?/span>
鏈変互涓嬫柟娉曞彲浠ヨ冭檻錛?br>1錛?span>
2錛?nbsp;浠ヤ竴緇勯殢鏈哄厓绱犳瀯閫犱簩鍙夋爲(wèi)錛岀劧鍚庢浛鎹㈣繖浜涘厓绱狅紝鐒跺悗閫氳繃鏃嬭漿寰楀埌騫寵 鐨勬爲(wèi)銆傚弬鑰冮殢鏈烘爲(wèi)銆?br>3錛?nbsp;閲嶆瀯榪欑鏍?br>
閲嶆瀯鏁寸鏍?br>1錛?nbsp;鎶婂厓绱犳嫹璐濆埌鏁扮粍涓紝浠ュ崌搴忔帓搴?br>2錛?nbsp;娓呯┖榪欐5鏍?br>3錛?nbsp;浠庢暟緇勪腑楂樺害涓嶆帓搴忕殑閫夊彇鍏冪礌鎻掑叆鏍?wèi)涓?/span>鍙互榪欐牱瀹屾垚絎笁姝ワ細(xì)
鍙互閫掑綊鐨勫疄鐜幫細(xì)
// Assuming array ranges from [0..arraySize-1]
GetFromOrderedArray(0,arraySize-1)
.
.
void GetFromOrderedArray(int lowBound,int highBound)
{
if (hi < low) return;
middlePos = lowBound+(highBound-lowBound)/2
// middlePos is now at the element in the middle
// between lowBound and highBound, so we just add
// it to the tree
AddElement ( theOrderedArray[middlePos] )
// Pick the middle one "to the left"
AddFromOrderedArray(lowBound,middlePos-1)
// Pick the middle one "to the right"
AddFromOrderedArray(middlePos+1,highBound)
}
鍒犻櫎涓涓厓绱?br>
2錛?nbsp;緇欐瘡涓厓绱犱竴涓寚鍚戝弻浜茬殑鎸囬拡
鎺ヤ笅鏉ュ氨鏄垹闄ょ殑榪囩▼浜嗭細(xì)
1錛?nbsp;鍓柇E涓庝粬鍙屼翰鐨勮繛鎺?br>2錛?nbsp;灝嗗乏鍙沖瀛愭墍鍦ㄧ殑瀛愭爲(wèi)鍚屽叾浠栧厓绱犱竴鏍峰姞鍒版爲(wèi)涓?br>3錛?nbsp;鍒犻櫎Evoid RemoveElement(TreeElement* theOneToRemove)
{
TreeElement* pParent = theOneToRemove->GetParent();
// Ok, so it has a parent, then we'll simply just disconnect it.
if (pParent)
{
if (pParent->GetLeftChild() == theOneToRemove)
{
pParent->SetLeftChild(NULL);
}
else
{
ASSERT(pParent->GetRightChild() == theOneToRemove);
pParent->SetRightChild(NULL);
}
}
else
{
// No parent? Then we're removing the root element.
theTopMostElement = NULL;
}
// Disconnected, now we reconnect its children (if any)
// just by adding them as we add any other node.
if (theOneToRemove->GetLeftChild())
AddElement(theOneToRemove->GetLeftChild());
if (theOneToRemove->GetRightChild())
AddElement(theOneToRemove->GetRightChild());
//Zap the element (if that's what you want to do)
delete theOneToRemove;
}
娉ㄨВ錛?/span>
#鍐呭閫夎嚜CodeGuru
鑻ョ悊瑙i敊璇紝嬈㈣繋鎸囨錛?/span>
鍙渶婊¤凍
x=y'
y=x'-(a/b)y'
//d=gcd(a,b)=ax+by
#include<iostream>
using namespace std;
int extEuclid(int a,int b,int&x,int&y)
{
int d,tmp;
if(!b)
{x=1;y=0;return a;}
d=extEuclid(b,a%b,x,y);
tmp=x;
x=y;
y=tmp-(a/b)*y;
return d;
}
int main()
{
int a,b,x=0,y=0;
cin>>a>>b;//99 78
cout<<extEuclid(a,b,x,y)<<'\t'<<x<<'\t'<<y;
//system("pause");
return 0;
}
濡傛灉灝嗚緭鍑烘敼涓?br>
cout<<extEuclid(a,b,x,y)<<endl;
cout<<'\t'<<x<<'\t'<<y;
涔熷氨鏄?a^b%n=((a^b-1)*a)%n====>(a*b)%n=((a%n)*b)%n===>a^b%n=(((a^(b/2))%n)*a^(b/2))%n
//榪唬娉?/span>
int modexp2(int a,int b,int n)
{
int r;
r=a%n;
for(int i=0;i<b-1;i++)
r=(r*a)%n;
return r;
}
(a^b)%n=(a^錛坆/2錛?n * a^錛坆/2錛?n)%n
鏍規(guī)嵁榪欎釜鍏紡錛岃璁哄鏁板拰鍋舵暟澶勭悊
int modExp(int a, int b, int n)
{
int d=1,r=a;
while(b)
{
if(b%2==1)
{d=d*r%n;}
r=r*r%n;
b=b/2;
}
return d;
}
//(a^b)%n
#include<iostream>
//榪欓噷鐢ㄧ殑鏄粈涔堟柟娉曞憿?
int modExp(int a,int b,int n)
{
int t=1,y=a;
while(b)
{
if(b%2==1)t=t*y%n;
y=y*y%n;
b=b/2;
}
return t;
}
//甯歌
int modexp(int a,int b,int n)
{
int t=1;
for(int i=0;i<b;i++)t=t*a;
return t%n;
}
int main(void)
{
int a=0,b=0,n=0;
std::cin>>a>>b>>n;
std::cout<<modExp(a,b,n)<<std::endl;
std::cout<<modexp(a,b,n)<<std::endl;
return 0;
}
璋佽兘緇欐垜璁茶瀹冭繖涓柟娉曟槸浠涔堟暟瀛﹀師鐞嗗憿?
//絎簩涓嚱鏁頒粎涓烘祴璇曟紜ц緗?涓嶈冭檻婧㈠嚭闂
//闈為掑綊杈楄漿鐩擱櫎姹傛渶澶у叕綰︽暟
int gcd(int a,int b)
{
int r=0;
r=a%b;
while(r)
{
a=b;
b=r;
r=a%b;
}
return b;
}
//鏈灝忓叕鍊嶆暟
int lcm(int a,int b)
{
return (a*b)?a*b/gcd(a,b):0;
}
//姹傛渶澶у叕綰︽暟,鍏紡if(a=b*q+r)then(gcd(a,b)=gcd(b,r))
int gcd(int a,int b)
{
return (a%b)?gcd(b,a%b):b;
}
//闈為掑綊杈楄漿鐩擱櫎
int gcd(int a,int b)
{
int r=0;
r=a%b;
while(r)
{
a=b;
b=r;
r=a%b;
}
return b;
}
a.璇佹槑鏈鍧忔儏鍐典笅錛宯/k涓瓙搴忓垪鐢ㄦ彃鍏ユ潵鎺掑簭鐨勬椂闂存椂O(nk).
聽聽聽鎻掑叆鎺掑簭涓篛(n*n)錛岄偅涔堝闀垮害涓簁鐨勫瓙搴忓垪鎺掑簭涓篛(k*k),n/k涓瓙搴忓垪鎺掑簭鏃墮棿鍜屾槸(n/k)*O(k*k)=O(n*k),寰楄瘉
b.璇佹槑鍦ㄦ渶鍧忔儏鍐典笅鍚勫瓙搴忓垪鍙互鍦∣(nlg(n/k))涓嬪悎騫?
c.璁句慨鏀瑰悗鍚堝茍綆楁硶鐨勬椂闂撮樁涓篛(nk+nlg(n/k)).璇風(fēng)粰鍑烘渶澶ф笎榪戝糼錛堜互O璁板彿錛宬鏄痭鐨勫嚱鏁幫級(jí)浣垮緱淇敼鍚庣殑綆楁硶鏈夊拰鏍囧噯鍚堝茍綆楁硶涓鏍風(fēng)殑娓愯繎榪愯鏃墮棿
d.k鐨勫煎湪瀹為檯涓浣曠‘瀹氾紵
灝忓皬鐨勯敊璇紝鎵句簡鎴戝崐澶?/p>
int merge(int*A,int p,int q,int r){
聽int n1=q-p+1;
聽int n2=r-q;
聽int* L = new int[n1];
聽int* R = new int[n2];
聽for(int i=0;i<n1;++i)
聽 L[i]=A[p+i];
聽for(int j=0;j<n2;++j)
聽 R[j]=A[q+1+j];
聽i=0;j=0;
聽for(int k=p;k<r;k++){
聽 if(L[i]<=R[j]){A[k]=L[i++];}
聽 else {A[k]=R[j++];}
聽}
聽return(0);
}
int mergesort(int*A,int p,int r){
聽int q;
聽if(p<r){
聽 q=(p+r)/2;
聽 mergesort(A,p,q);
聽 mergesort(A,q+1,r);
聽 merge(A,p,q,r);
聽}
聽return(0);
}
int main(){
聽聽聽 int b[6]={11,65,53,78,38,63};
聽聽聽 mergesort(b,0,5);
聽for(int i=0;i<6;++i)
聽 cout<<b[i]<<'\t';
聽return(0);
}
浠ヤ笅寮曠敤鑷細(xì)gooler鐨勪笓鏍?a >http://blog.csdn.net/Gooler/archive/2006/03/22/632422.aspx鏈夊悇縐嶆帓搴忕畻娉晀uicksort,heapsort...
/*
聽* A is an array and p, q, and r are indices numbering elements of the array
聽* such that p <= q < r.
聽*
聽* This procedure assumes that the subarrays A[p. .q] and A[q + 1. .r] are in
聽* sorted order. It merges them to form a single sorted subarray that replaces
聽* the current subarray A[p. .r].
聽*/
void merge(int A[], int p, int q, int r) {
聽聽聽 int i, j, k, size;
聽聽聽 int* B;
聽聽聽
聽聽聽 size = r - p + 1;
聽聽聽 B = new int[size]; /* temp arry for storing the merge result */
聽聽聽
聽聽聽 /* initialize B */
聽聽聽 for (i = 0; i < size; ++i) {
聽聽聽 聽聽聽 B[i] = 0;
聽聽聽 }
聽聽聽 i = p;
聽聽聽 j = q + 1;
聽聽聽 k = 0;
聽聽聽
聽聽聽 /* compare and copy the smaller to B */
聽聽聽 while (i <= q && j <= r) {
聽聽聽 聽聽聽 if (A[i] < A[j]) {
聽聽聽 聽聽聽 聽聽聽 B[k++] = A[i++];
聽聽聽 聽聽聽 } else {
聽聽聽 聽聽聽 聽聽聽 B[k++] = A[j++];
聽聽聽 聽聽聽 }
聽聽聽 }
聽聽聽
聽聽聽 /* copy the rest to B */
聽聽聽 while (i <= q) {
聽聽聽 聽聽聽 B[k++] = A[i++];
聽聽聽 }聽聽聽
聽聽聽 while (j <= r) {
聽聽聽 聽聽聽 B[k++] = A[j++];
聽聽聽 }
聽聽聽
聽聽聽 /* replace A[p..r] with B[0..r-p] */
聽聽聽 for (i = p, k = 0; i <= r; ++i, ++k) {
聽聽聽 聽聽聽 A[i] = B[k];
聽聽聽 }
聽聽聽 delete[] B;
}
/*
聽* This procedure sorts the elements in the subarray A[p. .r].
聽*
聽* If p >= r, the subarray has at most one element and is therefore
聽* already sorted. Otherwise, the divide step simply computes an index
聽* q that partitions A[p. .r] into two subarrays: A[p. .q], containing n/2
聽* elements, and A[q + 1. .r], containing n/2 elements.
聽*/
void mergeSort(int A[], int p, int r) {
聽聽聽 if (p >= r) return;
聽聽聽
聽聽聽 int q = (p + r) / 2;
聽聽聽
聽聽聽 mergeSort(A, p, q);
聽聽聽 mergeSort(A, q + 1, r);
聽聽聽 merge(A, p, q, r);
}