poj 1833 排列

本文详细阐述了排序算法的优化过程,包括从右向左寻找关键元素并进行局部排序,通过实现具体步骤来提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:

1、从右边开始,找到一个满足右边大于自己的数,记为a

2、从这个数a开始向右找,找到一个最小的比a打的数,两者交换

3、把从a开始向右的所有数用qsort从小到大排个序



#include<stdio.h>

#include<stdlib.h>



int num[1024];



int cmp(const void *a,const void *b)

{

return*((int *)a)-*((int *)b);

}



int main()

{

int m,n,k,i,index,mark,t;

scanf("%d",&m);

while(m--)

{

scanf("%d%d",&n,&k);

num[0]=1024;

for(i=1;i<=n;i++)

scanf("%d",&num[i]);

while(k--)

{

index=0;

mark=0;

for(i=n;i>0;i--)

if(num[i-1]<num[i])

{

index=i-1;

break;

}

if(index)

{

for(i=n;i>index;i--)

{

if(num[i]>num[index]&&num[i]<num[mark])

mark=i;

}

t=num[mark];

num[mark]=num[index];

num[index]=t;

}

qsort(num+index+1,n-index,sizeof(num[0]),cmp);

for(i=1;i<=n;i++)

printf("%d ",num[i]);

printf("\n");

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值