归并排序和快速排序

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
void Qsort(int *a,int x,int y){//自顶向下 先求出a[x]的位置
if(x<y){
int i=x,j=y;
while(i<j){
i++;
while(i<y&&a[i]<a[x]) i++;   //i与j不能越界
j--; //若a只有一个元素,j--后等于x,故到递归出口
while(j>x&&a[j]>a[x]) j--;
if(i<j){
int t=a[i];
a[i]=a[j];
a[j]=t;
}
}
int t=a[x]; a[x]=a[j]; a[j]=t;
Qsort(a,x,j);
Qsort(a,j+1,y);
}
}
void Mergesort(int *a,int x,int y,int *t){//自底向上
if(y-1>x){               //递归出口为一个元素,当区间为[x,x+1)时只有一个元素,递归完成
int m=x+(y-x)/2;
Mergesort(a,x,m,t); //分
Mergesort(a,m,y,t);
int p=x,q=m,i=x;
while(p<m||q<y){ //和
if(q>=y||(p<m&&a[p]<a[q])) t[i++]=a[p++];
else t[i++]=a[q++];
}
for(int i=x;i<y;i++) a[i]=t[i];
}

}



#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int A[10];
void qsort(int x,int y){
if(x<y-1){
int i=x,j=y;
while(i<j){
i++;
while(i<y&&A[i]<A[x]) i++;
j--;
while(j>x&&A[j]>A[x]) j--;
if(i<j){
int t=A[i]; A[i]=A[j]; A[j]=t;
}
}
int t=A[x]; A[x]=A[j]; A[j]=t;
qsort(x,j);
qsort(j+1,y);
}
}
void binary(int i,int j,int *fmax,int *fmin){
if(i==j-1){
*fmax=*fmin=A[i];
}else if(j-1>i){
int mid=i+(j-i)/2;
int gmax,gmin,hmax,hmin;
binary(i,mid,&gmax,&gmin);
binary(mid,j,&hmax,&hmin);
if(gmax>hmax) *fmax=gmax;
else *fmax=hmax;
if(gmin<hmin) *fmin=gmin;
else *fmin=hmin;
}
}
int main(){
int fmax,fmin;
srand(time(NULL));
for(int i=0;i<10;i++){
A[i]=(int)(((double)rand()/RAND_MAX)*100);
printf("%d ",A[i]);
}printf("\n");
fmax=fmin=A[0];
binary(0,10,&fmax,&fmin);
printf("max=%d  min=%d\n",fmax,fmin);
qsort(0,10);
for(int i=0;i<10;i++) printf("%d ",A[i]);
printf("\n");
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值