算法导论第2章—算法基础

来源:互联网 发布:fm2016经典球星数据库 编辑:程序博客网 时间:2024/05/18 01:27

2.1 插入排序

#include<iostream>using namespace std;void Insertion_Sort(int *A,int n);   //声明void Print(int *A,int n);void Insertion_Sort(int *A,int n){for(int j=1;j<n;j++){int key=A[j];int i=j-1;while(i>=0&&A[i]>key){A[i+1]=A[i];i=i-1;}A[i+1]=key;}}void Print(int *A,int n){for(int i=0;i<6;i++)cout<<A[i]<<" ";cout<<endl;}int main(){int A[]={5,2,4,6,1,3};int n=sizeof(A)/sizeof(A[0]);Insertion_Sort(A,n);Print(A,n);return 0;}

循环不变式

循环不变式主要用来帮助我们理解算法的正确性。必须证明三条性质:

初始化:循环的第一次迭代之前,它为真。

保持:如果循环的某次迭代之前它为真,那么下次迭代之前它仍为真。

终止:在循环终止时,不变式为我们提供一个有用的性质,该性质有助于证明算法是正确的。

2.2 分析算法

2.3 设计算法

归并排序:

#include<iostream>using namespace std;const int NIL=100000000;void Merge(int *A,int p,int q,int r);void Merge_Sort(int *A,int p,int r);void Print(int *A,int p,int r);void Merge(int *A,int p,int q,int r){int n1=q-p+1;int n2=r-q;int L[100],R[100];for(int i=0;i<n1;i++)L[i]=A[p+i];for(int j=0;j<n2;j++)R[j]=A[q+j+1];L[n1]=NIL;R[n2]=NIL;int i=0,j=0;for(int k=p;k<=r;k++){if(L[i]<=R[j]){A[k]=L[i];i=i+1;}else{A[k]=R[j];j=j+1;}}}void Merge_Sort(int *A,int p,int r){if(p<r){int q=(p+r)/2;Merge_Sort(A,p,q);Merge_Sort(A,q+1,r);Merge(A,p,q,r);}}void Print(int *A,int p,int r){for(int i=p;i<=r;i++)cout<<A[i]<<" ";cout<<endl;}int main(){int A[]={0,0,0,0,0,0,0,0,0,2,4,5,7,1,2,3,6,0,0};Merge_Sort(A,9,16);Print(A,9,16);return 0;}




0 0
原创粉丝点击