1. 程式人生 > >2019.4.27

2019.4.27

align roo fir col har dem 步驟 void clas

1.數組中,元素的位置稱為索引

2.遞歸,調用棧。

發現還是不會寫hanoi。。:

技術分享圖片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 void hanoi(int n,char a,char b,char c){
 4  if(n==1) cout<<n<<":"<<a<<"-->"<<c<<endl;
 5  else {
 6     hanoi(n-1,a,c,b);
 7     cout<<n<<"
:"<<a<<"-->"<<c<<endl; 8 hanoi(n-1,b,a,c); 9 } 10 } 11 int main() 12 { 13 int n; 14 cin>>n; 15 hanoi(n,a,b,c); 16 17 }
hanoi

3.分治:

▲步驟:1)找出基線條件(盡可能簡單)

2)不斷將問題分解(縮小規模),直至符合基線條件。

▲證明歐幾裏得算法(輾轉相除法):

https://zh.khanacademy.org/computing/computer-science/cryptography/modarithmetic/a/the-euclidean-algorithm

To prove that GCD(A,B)=GCD(B,R) we first neec GCD(A,B)=GCD(B,A-B).

Proof that the GCD(A,B) evenly dividesC .

Proof that the GCD(B,C) evenly dividesA

GCD(A,B)=GCD(B,A-B)

GCD(A,B)=GCD(A-B,B)=GCD(A-2B,B)

GCD(A,B)=GCD(B,R)

技術分享圖片

▲排序(以下都按從小到大):

1)冒泡排序:從左到右,數組中相鄰的兩個元素進行比較,將較大的放到後面。 // O(n^2)

2)選擇排序:從左到右,一個元素與他下面所有元素比較,找出最小的,和那個元素互換,開始下一輪。 // O(n^2)

3)快排:找基準數,左右兩邊放小於等於和大於,再遞歸。

技術分享圖片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 void quicksort(vector<int> &num,int l,int r)
 4 {
 5 
 6  if(l>= r) return;
 7  int i=l,j=r,x=num[l];
 8  while(i<j){
 9     while(i<j&&num[j]>=x)
10         j--;
11     if(i<j)
12         num[i++]=num[j]; //填坑之後再加
13     while(i<j&&num[i]<=x)
14         i++;
15     if(i<j)
16         num[j--]=num[i];
17  }
18  num[i]=x;  //把基準值放到i處
19  quicksort(num,l,i-1);  //以i為中間值,排左右兩邊
20  quicksort(num,i+1,r);
21 }
22 int main()
23 {
24    int f[]={3,35,2,1,8,5,6,2,0};
25    int len=sizeof(f)/sizeof(int);
26   /*前者是該int數組所占的內存總量(字節數),後者是單個int所占的內存,
27     合起來就是數組中元素的個數*/
28    vector<int> num(f,f+len);
29    for(int k=0;k<num.size();k++)
30     cout<<num[k]<<" ";
31    cout<<endl;
32    quicksort(num,0,len-1);
33    for(int k=0;k<num.size();k++)
34     cout<<num[k]<<" ";
35    cout<<endl;
36    return 0;
37 
38 }
快排--填坑法

2019.4.27