排序数字数组的有效方法,然后计算值增加的次数

Efficient way of sorting array of numbers, then count the number of times the value increased

例如,我想对以下内容进行排序:

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

进入:

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

然后打印出来:

8

我的错误代码:

#include<bits/stdc++.h>

using namespace std;

int main()
{
    vector <long long unsigned> a,b,c;
    long long unsigned n,k,count=0,j=1;
    cin>>n;
    for(long long unsigned i=0;i<n;i++)
    {
        cin>>k;
        a.push_back(k);
    }
    for(long long unsigned i=0;i<a.size();i++)
    {
        b.push_back(a[i]);
        if(a[i]==a[i+1])
        {
            count=count+b.size()-1;
            b.clear();
        }
        if(i==a.size()-1)
            count=count+b.size()-1;
    }
    cout<<count;
    return 0;
}

排序是可有可无的,我主要需要一个统计过程的好方法。

谢谢。

我不确定 "Efficient" 以您喜欢的方式对向量或数组进行排序的方法(即 1,2,3,4,1,2,3,4 ,1,2,4,4).但是对于一种详尽的方法,您可以...

遍历未排序的向量 (UV) 并找到高于前一次运行最小值的最小值(第一轮初始化为零,每次都没有高于搜索值的值)。当找到最小值时,记录其索引,并在遍历向量后删除存储索引处的值,并将该值添加到排序向量 (SV)。继续遍历UV直到为空,每一项都已经添加到SV中。现在遍历 SV 并在每次前一个值小于当前值时加 1。

  1. 初始化上一个最小值。和当前最小值,每次更新时也会存储其索引。
  2. 循环 UV(未排序的向量)。
  3. 如果一个值高于上一个最小值但低于当前最小值设置为新的当前最小值,并更新当前最小值索引。
  4. 在向量循环的末尾,您有当前最小值及其索引值。
  5. 如果前一个最小值与当前最小值相同,则将前一个最小值设置回零并再次循环(第 2 步)。
  6. 将当前最低值添加到 SV 并从 UV 中删除当前最小值。
  7. 将 prev-min 设置为 current-min 并重复循环(步骤 2)。
  8. 一旦 UV 为空,遍历 SV。
  9. 每次当前值高于前一个值时加一计数。

这应该生成排序后的向量,每个连续值都高于前一个值,除非它是最高值,在这种情况下,将使用下一个最低值。