算法导论学习笔记17_9_7

来源:互联网 发布:吉林国际软件 编辑:程序博客网 时间:2024/06/03 16:24

这几天学习了几个算法:

1.插入排序:

//插入排序

#include<stdio.h>
void insertSort(int *a,int n){
int i,j,key;
for(i=1;i<n;i++){
key=a[i];
j=i-1;
while(j>=0&&a[j]>key){
a[j+1]=a[j];
j--;
a[j+1]=key;
}
}

}
 


int main(){
int a[5]={3,9,6,5,7};
int len=5;
insertSort(a,len);
for(int i=0;i<5;i++){
printf("%d ",a[i]);
}
return 0;
}


2.归并算法

#include<stdio.h>
//·ÖÖι鲢Ëã·¨ 
void MERGE(int *a,int head,int mid,int end){
int temp[end-head+1];
int h=head,m=mid,n=mid+1,e=end;
int k=0;

while(h<=m&&n<=e){
if(a[h]<a[n]){
temp[k++]=a[h++];
}else{
temp[k++]=a[n++];
}
}
while(h<=m){
temp[k++]=a[h++];
}
while(n<=e){
temp[k++]=a[n++];
}
k=0;
for(k=0;k<end-head+1;k++){
a[k+head]=temp[k];
}




void MERGE_sort(int *a,int head,int end){
if(head<end){


int mid=(head+end)/2;
MERGE_sort(a,head,mid);
MERGE_sort(a,mid+1,end);
MERGE(a,head,mid,end);
}

}


int main(){

int a[]={6,9,3,1,164,0,64,974};
MERGE_sort(a,0,7);
for(int i=0;i<8;i++){
printf("%d ",a[i]);
}
return 0;
}

3.最大子数组

#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
//最大子数组
int  cross_max(int *a,int head,int mid,int end){
int left_max=INT_MIN,right_max=INT_MIN;
int sum=0;
for(int i=mid;i>=head;i--){
sum+=a[i];
if(left_max<sum){
left_max=sum;
}
}
sum=0;
for(int j=mid+1;j<=end;j++){
sum+=a[j];
if(right_max<sum){
right_max=sum;
}
}
return (left_max+right_max);
}


int maxsubset(int *a,int head,int end){
if(head==end){
return a[head];
}

int mid=(head+end)/2;
int l_max=INT_MIN;
int r_max=INT_MIN;
int m_max=INT_MIN;
l_max=maxsubset(a,head,mid);
r_max=maxsubset(a,mid+1,end);
m_max=cross_max(a,head,mid,end);

if(l_max>=r_max&&l_max>=m_max){
return l_max;
}else if(r_max>=l_max&&r_max>=m_max){
return r_max;
}else{
return m_max;
}
}


int main(){
int a[]={2,-6,3,-9,5,6,8,-15,6,60,-19,20};//12个
    printf("the maxsubset:%d\n",maxsubset(a,0,11));
return 0;
}


原创粉丝点击