插入排序

这篇博客探讨了插入排序算法,重点在于理解如何通过从序列左侧选取元素并找到合适位置插入,来确保序列最终成为递增序列的过程。博客内容包含输入输出格式说明以及样例输入输出,旨在帮助读者掌握插入排序的最少操作次数计算方法。

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


  
  

Description

每次选择序列最左边的数,然后将其插入到序列中任意一个位置。求至少需要重复进行多少次上述操作,才可以将序列变为一个递增序列。

Input

输入的第一行包含一个整数T (T > 0),表示一共有T组测试数据.
对于每组测试数据,第一行包含一个整数n (1 ≤ n ≤ 105),表示这个序列中一共有n个整数。第二行包含n个各不相同的整数(这些整数均在[1, 109]范围内),依次描述了这个序列中的各个数。

Output

对于每组测试数据,输出一个整数,表示至少需要重复进行多少次上述操作,才可以将这个序列变为一个递增序列。

Sample Input

3
3
1 2 3
3
1 3 2
5
1 5 4 3 2

Sample Output

0
2
4
从后往前扫描,若扫描过的值已经按递减(即从前往后递增)有序则接着扫描,每两个值比较大小,直到出现前一元素值大于后一元素,则前一元素需要移动,
题中又说每次从最左侧移动,所以这一元素包括它本身之前的所有元素都需要移动,那么直接跳出输出此时数组下标即可

//AC.

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
long long int a[100005];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        memset(a,0,sizeof(a));
        scanf("%d",&n);
        int m=0,k=n-1;
        while(m<n)
        {
            scanf("%lld",a+(m++));
        }
        while(a[m-1]>a[m-2]&&(m-2)>-1)
        {
            m--;                         //当a[m-1]〉a[m-2]说明a[m-2]不需要移动,反之包括a[m-2]在内及之前的所有元素都需要移动,共m-2+1个
        }
        printf("%d\n",m-1);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值