您的位置:首页 > 其它

杭电ACM 2020:绝对值排序

2015-05-04 18:54 267 查看
原创作品 转载请注明出处 /article/10717370.html



这个问题主要难点在于排序,排序有好多种算法,在一般情况下使用快速排序效果比较好。我的算法就是使用这个排序算法。这个算法,我在代码注释得很清楚,看看代码就应该很容易就明白了。程序里面用到了一个绝对值函数labs(),把头文件包含进来调用即可。我的AC代码如下:

#include <iostream>
#include<math.h>
#include<stdlib.h>
using namespace std;

void quickSort(int*p,int l,int r)//对从p[l]到p[r]的元素进行排序
{
int labs_temp,temp;
int i=l,j=r;
if(l<r)
{
//将p[l]元素作为枢轴,labs_temp保存p[l]取绝对值后的数
//temp保存p[l]
labs_temp=labs(p[l]);
temp=p[l];
/*下边这个循环完成了一趟排序,即将数组中小于labs_temp的元素放在左边,
大于labs_temp的元素放在右边*/
while(i!=j)
{
while(j>i&&labs(p[j])>labs_temp) --j;//从右往左扫描找到一个小于labs_temp的元素

if(i<j)
{
p[i]=p[j];//放在labs_temp左边
++i;//i指针右移
}

while(i<j&&labs(p[i])<labs_temp) ++i;//从左边往右边扫描,找到一个大于labs_temp的元素

if(i<j)
{
p[j]=p[i];//放在labs_temp的右边
--j;//j左移一位
}
}

p[i]=temp;//将temp放在最终位置
quickSort(p,l,i-1);//递归的对temp左边元素进行排序
quickSort(p,i+1,r);//递归的对temp右边元素进行排序
}
}

int main(void)
{
int n,*input_str;
while(cin>>n&&n)
{
//分配输入数据的空间
input_str=new int
;
for(int i=0; i<n; i++)
cin>>input_str[i];
//调用上面的快速排序算法进行内部排序
quickSort(input_str,0,n-1);
//因为要从大到小的顺序输出,所以反向输出
for(int j=n-1; j>=0; j--)
{
if(j==0)
cout<<input_str[j]<<endl;
else
cout<<input_str[j]<<" ";
}
//释放空间
delete input_str;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: