判断序列是否为有序序列

该博客介绍了一个算法问题,即输入一个整数序列,判断其是否为有序序列。有序序列定义为从小到大或从大到小排列(包括相同元素)。作者提出了一个解决方案,通过计算序列中两两相邻元素相减后的正负结果计数,如果计数等于序列长度减一,则序列有序。给出了C语言实现代码并附带了两个测试案例。

描述:

输入一个整数序列,判断是否是有序序列,有序,指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)。

数据范围: 3 <=n <=50 序列中的值都满足1<= lev <= 100

输入描述:

第一行输入一个整数N(3≤N≤50)。

第二行输入N个整数,用空格分隔N个整数。

输出描述:

输出为一行,如果序列有序输出sorted,否则输出unsorted。

示例1

输入:

5
1 6 9 22 30

输出:

sorted

示例2

输入:

5
3 4 7 2 10

输出:

unsorted

思路:

针对这题,我的想法是用前一个数来减后一个数,然后根据结果大小来进行计数,两个数两两相减会产生n-1个数,所以如果说最后计数结果为n-1,那么就是说这个序列的趋势是一样的,也就是有序序列,这样就实现了判断

代码如下:

#include <stdio.h>
int main()
{
    int i,arr[100],n,cnt1=0,cnt2=0;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&arr[i]);
    }
    for(i=0;i<n-1;i++)
    {
       if(arr[i]-arr[i+1]>=0)
           cnt1++;//降序计数
       else if(arr[i]-arr[i+1]<=0)
           cnt2++;//升序计数
    }
    if(cnt1==n-1||cnt2==n-1)//一共n个数,两两相减的到n-1个结果
        printf("sorted");
    else
        printf("unsorted");
}

判断几个序列谁更接近“有序”的状态,通常需要通过一定的度量标准来进行评估。常见的方法包括计算逆序对的数量、步长分析等。 ### 方法一:**逆序对数量** 一个简单的标就是统计每个序列中逆序对的总数。所谓逆序对是一个数组里存在两个数 \(i\) 和 \(j\) (\(i < j\)),使得 \(arr[i] > arr[j]\) 。逆序对越多说明该序列越无序;反之则越有序。 - **优点**: 直观易懂,并且可以准确地反映数据偏离理想顺序的程度。 - **缺点**: 计算复杂度较高,在最坏的情况下时间复杂度达到 O(n log n),例如使用归并排序算法来计数。 #### 算法示例 (Python): ```python def count_inversions(arr): def merge_count_split_inv(left, right): result = [] i, j, inv_count = 0, 0, 0 while i < len(left) and j < len(right): if left[i] <= right[j]: result.append(left[i]) i += 1 else: result.append(right[j]) inv_count += len(left)-i # Count all remaining elements in 'left' j += 1 result.extend(left[i:]) result.extend(right[j:]) return result, inv_count if len(arr) <= 1: return arr, 0 mid = len(arr)//2 l_arr, x = merge_count_split_inv(*count_inversions(arr[:mid])) r_arr, y = merge_count_split_inv(*count_inversions(arr[mid:])) merged_arr, z = merge_count_split_inv(l_arr,r_arr) return merged_arr ,x + y +z # 测试例子 sequence1 = [4,5,6,7] sequence2 = [7,6,5,4] _,inv_seq_1=count_inversions(sequence1) _,inv_seq_2=count_inversions(sequence2) print(f"Sequence {['is', ''][inv_seq_1>inv_seq_2]} more ordered.") ``` --- ### 方法二:**希尔系数** 另一种快速衡量的办法是基于元素之间的位置差异程度——即希尔系数(Shell Coefficient)。对于长度为n 的列 `a` ,其公式定义如下: \[ S(a)=\frac{1}{n^2}\sum_{k=0}^{n-1}(n-k)a[k]-\min \Big(\bigcup a[k..n]\Big)\] 这个数值反映了整个序列趋向单调递增的趋势强度。S值越大示整体越趋于上升趋势,因而较有秩序。 - **优势:** 可在线性时间内完成初步估算; - **局限性:** 它只能提供大致估计结果而无法精确出确切紊乱情况。 --- 综合考虑效率及效果的话,推荐先尝试利用**逆序对数目**做细致化评判即可满足大多数应用场景需求啦~
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

遇见陌生人了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值