2021-01-06

排序
今天学习了sort快速排序
sort快速排序采用了分治的思想,通过函数递归处理。
在c语言如果想用快排,必须自己编写。
编写sort排序,做了三题
洛谷
P1177 【模板】快速排序

#include<stdio.h>
int f[2000002];

void sort(int *a, int left, int right);
int main(){
int n,l,*F=f;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&f[i]);
sort(F,0,n-1);
for(int i=0;i<n;i++)
printf("%d ",f[i]);

}

void sort(int *a, int left, int right)
{
if(left >= right)
{
return ;
}
int i = left;
int j = right;
int key = a[left];

while(i < j)                               
{
    while(i < j && key <= a[j])
    {
        j--;
    }
     
    a[i] = a[j];
     
    while(i < j && key >= a[i])
    {
        i++;
    }
     
    a[j] = a[i];
}
 
a[i] = key;
sort(a, left, i - 1);
sort(a, i + 1, right);

}

P1923 【深基9.例4】求第 k 小的数

#include<stdio.h>
int f[5000002];

void sort(int *a, int left, int right);
int main(){
int k,n,l,*F=f;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
scanf("%d",&f[i]);
sort(F,0,n-1);
printf("%d",f[k]);

}

void sort(int *a, int left, int right)
{
if(left >= right)
{
return ;
}
int i = left;
int j = right;
int key = a[left];

while(i < j)                               
{
    while(i < j && key <= a[j])
    {
        j--;
    }
     
    a[i] = a[j];
     
    while(i < j && key >= a[i])
    {
        i++;
    }
     
    a[j] = a[i];
}
 
a[i] = key;
sort(a, left, i - 1);
sort(a, i + 1, right);

}

P1093 [NOIP2007 普及组] 奖学金

#include<stdio.h>
int f[305][5],e[305],g[305],h[305];

void sort(int *a, int *b, int *c, int left, int right);
int main(){
int n,l,*E=e,*G=g,*H=h;
scanf("%d",&n);
l=n;
getchar();
for(int i=1;i<=n;i++){
g[i]=i;
scanf("%d%d%d",&f[i][1],&f[i][2],&f[i][3]);
e[i]=f[i][1]+f[i][2]+f[i][3];
h[i]=f[i][1];
getchar();
}
sort(E,G,H,1,n);

for(int i=1;i<=l;i++){

for(int j=i;j<=l;j++){
	if(e[i]==e[j]){
		if(h[i]>h[j]){
			int t;
			t=e[i];e[i]=e[j];e[j]=t;
			t=g[i];g[i]=g[j];g[j]=t;
			t=h[i];h[i]=h[j];h[j]=t;
		}
		else if(h[i]==h[j]){
			if(g[i]<g[j]){
			int t;
			t=e[i];e[i]=e[j];e[j]=t;
			t=g[i];g[i]=g[j];g[j]=t;
			t=h[i];h[i]=h[j];h[j]=t;
		}
		
}

}
}
}

for(int i=n;i>n-5;i--){
if(i!=n-4)
printf("%d %d\n",g[i],e[i]);
else printf("%d %d",g[i],e[i]);

}
}

void sort(int *a, int *b, int *c, int left, int right)
{
if(left >= right)
{
return ;
}
int i = left;
int j = right;
int key = a[left],key1 = b[left],key2 = c[left];

while(i < j)                               
{
    while(i < j && key <= a[j])
    {
        j--;
    }
     
    a[i] = a[j];
    b[i] = b[j];
    c[i] = c[j];
     
    while(i < j && key >= a[i])
    {
        i++;
    }
     
    a[j] = a[i];
    b[j] = b[i];
    c[j] = c[i];
    }
 
a[i] = key;
b[i] = key1;
c[i] = key2;
sort(a, b, c, left, i - 1);
sort(a, b, c, i + 1, right);

}

都是比较基础的快排应用题。
快排函数的编写通常需要联系到一维数组或多维数组的传递,
一维数组的传递比较简单,多维数组则对指针运用的难度增加。
在需要多个数组时,
比较好的解决方法是构造结构体,可以使代码更简洁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值