您的位置:首页 > 编程语言

编程练习:合并两个数组(包括三种快排程序)

2016-09-29 16:43 393 查看
#include <stdio.h>
#include <stdlib.h>

/*确定快排1的分界值*/
int partition1(int array[],int r,int m){
int i,j=m,temp,flag1=0,flag2=0;//比较的数是大数时将flag1置1,也就是当遇到大数之后,再次遇到小数才进行前后交换;
//flag2为0时,j=i,第一次遇到大数时,把flag2置1;也就是说,j的初始值为参考值的坐标,
//当遇到大数时,j的值改变为第一个大数的坐标(j=i),后续j的值的变化仅跟是否发生交换有关
if(r<m){
for(i=r;i<m;i++){
if(array[i]>array[m]){
flag1=1;
if(!flag2) {
j=i;
flag2=1;
}
}
else{
if(flag1){
temp=array[i];
array[i]=array[j];
array[j]=temp;
j++;
}
}
}
temp=array[j];
array[j]=array[m];
array[m]=temp;
return j;
}
}
/*快排1,以最后一个数作为参考值*/
void sort1(int array[],int r,int m){
int p;
if(r<m){
p=partition1(array,r,m);
sort1(array,r,p-1);
sort1(array,p+1,m);
}
}
/*确定快排2的分界值*/
int partition2(int array[],int r,int m){
int i,j=m+1,temp,flag1=0,flag2=0;//比较的数是大数时将flag1置1,也就是当遇到大数之后,再次遇到小数才进行前后交换;
//flag2为0时,j=i,第一次遇到大数时,把flag2置1;也就是说,j的初始值为参考值的坐标,
//当遇到大数时,j的值改变为第一个大数的坐标(j=i),后续j的值的变化仅跟是否发生交换有关
if(r<m){
for(i=r+1;i<=m;i++){
if(array[i]>array[r]){
flag1=1;
if(!flag2) {
j=i;
flag2=1;
}
}
else{
if(flag1){
temp=array[i];
array[i]=array[j];
array[j]=temp;
j++;
}
}
}
temp=array[j-1];
array[j-1]=array[r];
array[r]=temp;
return j-1;
}
}
/*快排2*/
void sort2(int array[],int r,int m){
int p;
if(r<m){
p=partition2(array,r,m);
sort2(array,r,p-1);
sort2(array,p+1,m);
}
}

/*快排3*/
void sort3(int array[],int r,int m){
int low=r,high=m,key=array[r];
if(low<high){
while(low<high){
while(low<high&&array[high]>key)
high--;
array[low]=array[high];
while(low<high&&array[low]<=key)
low++;
array[high]=array[low];
}
array[low]=key;
sort3(array,r,low-1);
sort3(array,low+1,m);
}
}

int main(int argc, char *argv[]) {
int i,j,k,m,n,A[500],B[500],C[1000];
scanf("%d",&m);
for(i=0;i<m;i++)
scanf("%d",&A[i]);
scanf("%d",&n);
for(j=0;j<n;j++)
scanf("%d",&B[j]);
i=j=0;

/*合并两个有序的数组*/
//    for(k=0;k<m+n;k++){
//        if(i>=m&&j<n){
//            C[k]=B[j];
//            j++;
//        }
//        if(j>=n&&i<m){
//            C[k]=A[i];
//            i++;
//        }
//        if(i<m&&j<n){
//            if(A[i]<B[j]){
//                C[k]=A[i];
//                i++;
//            }
//            else{
//                C[k]=B[j];
//                j++;
//            }
//        }
//    }

/*合并两个无序的数组*/
for(k=0;k<m+n;k++){
if(i<m){
C[k]=A[i];
i++;
}
else{
C[k]=B[j];
j++;
}
}
//sort1(C,0,m+n-1);
//sort2(C,0,m+n-1);
sort3(C,0,m+n-1);

//打印合并后的有序数组
for(k=0;k<m+n;k++)
printf("%d ",C[k]);
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐