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;
}