2020.绝对值排序

绝对值排序

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 77560 Accepted Submission(s): 36935

Problem Description
输入n(n<=100)个整数,按照绝对值从大到小排序后输出。题目保证对于每一个测试实例,所有的数的绝对值都不相等。

Input
输入数据有多组,每组占一行,每行的第一个数字为n,接着是n个整数,n=0表示输入数据的结束,不做处理。

Output
对于每个测试实例,输出排序后的结果,两个数之间用一个空格隔开。每个测试实例占一行。

Sample Input
3 3 -4 2
4 0 1 2 -3
0

Sample Output
-4 3 2
-3 2 1 0

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    int n,i,j,t;
    int a[1000];
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)break;
        for(i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
        }
        for(i=0;i<n-1;i++)
            for(j=0;j<n-1-i;j++)
        {
            if(fabs(a[j])<fabs(a[j+1]))//利用绝对值函数
            {
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
        printf("%d",a[0]);
        for(i=1;i<n;i++)
        {
            printf(" %d",a[i]);
        }
        printf("\n");
    }
    return 0;
}
### 关于2020绝对值排序的快速排序算法实现与分析 #### 快速排序算法概述 快速排序是一种基于分治法的高效排序算法。该算法通过选择一个基准元素(pivot),将待排序序列划分为两部分,一部分小于等于基准值,另一部分大于基准值,之后递归地对这两部分继续执行相同的操作直到整个序列有序。 对于特定场景下的优化版本——针对绝对值排序问题,可以通过调整比较逻辑来适应需求。在处理绝对值排序时,主要关注数值大小而非正负号的影响[^1]。 #### 时间复杂度分析 通常情况下,如果输入数据接近随机分布,则快速排序表现出良好的性能特征,具有较好的期望时间复杂度\( O(n\ log\ n)\)。然而,在某些特殊情形下,比如已经完全升序或降序排列的数据集上,若总是选取第一个或最后一个元素作为枢轴点(pivot),则可能导致最差情况的发生,此时的时间复杂度会退化到 \(O(n^{2})\) 。为了避免这种情况发生,可以选择更合理的策略挑选枢纽元,例如三数取中法或是随机选取等方法。 #### 空间复杂度考量 尽管快速排序属于就地(in-place)排序方式之一,意味着理论上不需要额外分配大量辅助存储空间;但由于采用了递归来完成子数组分割过程,所以实际上还是需要用到一定量的栈内存用于保存每次调用的状态信息。理想状态下所需的空间开销大约为 \(O(\log\ n)\),但在极端条件下可能会增长至线性级别即 \(O(n)\)[^1]。 #### 不稳定性的解释 值得注意的是,由于存在元素互换操作,使得原本相等项之间的相对顺序可能发生变化,故而快速排序并不保证稳定性。这意味着如果有多个相同的键值存在于列表之中,它们原始次序未必能在最终结果里得以保持不变。 #### C++代码实例展示 下面给出一段适用于解决“2020 绝对值排序”的C++程序片段: ```cpp #include <iostream> #include <vector> using namespace std; // 定义按绝对值比较函数对象 struct AbsCompare { bool operator()(int a, int b){ return abs(a)<abs(b); } }; void quickSort(vector<int>& nums,int low ,int high){ if(low >=high )return ; // 随机选取中间节点并交换到low处 srand((unsigned)time(NULL)); int randIndex=low+rand()%(high-low+1); swap(nums[randIndex],nums[low]); int pivot = nums[low]; int i = low; for(int j=low+1;j<=high;++j){ if(abs(nums[j])<abs(pivot)){ ++i; swap(nums[i],nums[j]); }else if(abs(nums[j])==abs(pivot)&&nums[j]<pivot){ ++i; swap(nums[i],nums[j]); } } swap(nums[low],nums[i]); quickSort(nums,low,i-1); quickSort(nums,i+1,high); } int main(){ vector<int> data={-7,-9,5,6,-3}; cout<<"Before sorting:"<<endl; for(auto& num :data ) cout<<num<<"\t"; cout<<endl; quickSort(data,0,data.size()-1); cout<<"After sorting by absolute value:"<<endl; for(auto &num:data) cout<<num<<"\t"; cout<<endl; } ``` 此段代码实现了带有自定义比较器`AbsCompare`结构体以及改进版分区方案的快速排序功能,能够有效地按照整型变量的绝对值从小到大进行重排,并且加入了简单的测试样例验证效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值