蓝桥杯2013Java题5(三部排序)
发布日期:2021-05-11 00:19:44 浏览次数:26 分类:精选文章

本文共 786 字,大约阅读时间需要 2 分钟。

5.标题:三部排序

传统排序算法如快速排序、希尔排序等确实高效,但在实际应用中,常常需要个性化处理。对于整型数组的特殊排序任务,这里提出了一种高效方案。任务目标是将数组划分为三个区域:负数全部位于左端,零集中在中间,正数则占据右区。值得注意的是,负数区域和正数区域的内部不需要有序。通过线性扫描即可完成整次任务的处理。
这种方法基于以下算法思路:选择一个初始扫描指针p,从数组开始位置开始工作。同时维护两个指针left和right,分别指向当前已知位置的左右边界。执行三步操作:一是让p从0逐步扩展工作范围;二是遇到负数时与left指针对应的元素交换位置并两边都向右推进;三是遇到正数时与right指针对应的元素交换位置并两边都向左缩短。特殊情况即为遇到零时,无需任何交换,仅让p前进。
以下是具体实现代码:
static void sort(int[] x)
{
int p = 0;
int left = 0;
int right = x.length - 1;
while (p <= right)
{
if (x[p] < 0)
{
int t = x[left];
x[left] = x[p];
x[p] = t;
left++;
p++;
}
else if (x[p] > 0)
{
int t = x[right];
x[right] = x[p];
x[p] = t;
right--;
}
// 当x[p] == 0时,无需处理,仅p递进
else
{
p++;
}
}
}
建议填写
在else语句处。完成后,数组即可按负、零、正三区排序。如给定数组:25,18,-2,0,16,-5,33,21,0,19,-16,25,-3,0,排序结果应为:-3,-2,-16,-5,0,0,0,21,19,33,25,16,18,25。
上一篇:最容易理解的快速排序
下一篇:2013年蓝桥杯JavaA组题4(颠倒的价牌)

发表评论

最新留言

感谢大佬
[***.8.128.20]2025年04月11日 21时34分30秒