Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/165.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 确定插入排序中执行的移位数?_C++_Arrays_Sorting_Insertion Sort - Fatal编程技术网

C++ 确定插入排序中执行的移位数?

C++ 确定插入排序中执行的移位数?,c++,arrays,sorting,insertion-sort,C++,Arrays,Sorting,Insertion Sort,我正在努力解决这个问题 问题是找到插入排序中的移位数。 我已经写了代码,但无法找出我在逻辑上的错误 #包括 #包括 #包括 //根据需要包括标题 使用名称空间std; int main() { //在这里编写代码 int T,count,n,*a; //int imin; cin>>T; int值,孔; 而(T--) { cin>>n; 计数=0; a=新整数[n]; //读取输入数组 对于(int i=0;i>a[i]; } //认为第0个元素已被排序,并且 //未排序的剩余列表 对于(in

我正在努力解决这个问题 问题是找到插入排序中的移位数。

我已经写了代码,但无法找出我在逻辑上的错误

#包括
#包括
#包括
//根据需要包括标题
使用名称空间std;
int main()
{
//在这里编写代码
int T,count,n,*a;
//int imin;
cin>>T;
int值,孔;
而(T--)
{
cin>>n;
计数=0;
a=新整数[n];
//读取输入数组
对于(int i=0;i>a[i];
}
//认为第0个元素已被排序,并且
//未排序的剩余列表
对于(int i=1;i0&&a[hole-1]>值)
{
// 
a[孔]=a[孔-1];
孔=孔-1;
计数++;
}
a[孔]=值;
}

//cout在插入排序中进行的交换的数量等于数组中的数量(无序元素对的数量)。有一个用于计算在时间O(n log n)内运行的数组中的反转数量的。它基于mergesort的一个稍加修改的版本,我认为您编写它应该不会有太多问题。

您的方法的问题是您没有正确实现插入排序,您实现的是反向冒泡排序

对于比@templatetypedef的
O(n log n)
解决方案稍微不复杂(但复杂度更差:p),您可以通过应用正确的实现,以与排序
O(n^2)
相同的复杂度来解决它

您应该为
交换(int*array,int index_a,int index_b)
实现一个函数,然后计算调用此函数的次数


这到维基百科有一个很好的伪代码给你

那么你的问题是什么?你说你“在逻辑上出错了”。它不起作用吗?移位的次数错了吗?你怎么知道?你的意思是在while循环的每一次迭代中将计数重置为
0
a=new int[n];
你有一个内存泄漏
a[hole]
你叫我什么?:-)我知道这不是交换操作。你完全正确,我同意你的看法。然而,我不确定这是一个答案。更多的评论,真的。@AndyG这肯定是答案。我试过了,但失败了:;我能够用O(n*log(n)+n)编写它,使用合并排序,然后编写代码来比较剩下的两个数组,但它仍然失败最大的数组,我开始相信必须有一个更简单的解决方案,有人知道吗?合并部分是n*log(n),比较两个排序数组的代码是O(n)——为了让您了解它们应用的测试,其中一个有5个数组的输入,它们组成了一个11mb的文件
#include<iostream>
#include<cstdio>
#include<cmath>
// Include headers as needed

using namespace std;

int main()
{
// Write your code here
int T,count,n,*a;
// int imin;
cin >> T;
int value,hole;

while(T--)
{
    cin >> n;
    count=0;
    a=new int[n];
    //reading the input array
    for(int i=0;i<n;i++)
    {
        cin >> a[i];
    }

    // considering the 0th element to be already sorted and
    // remaining list unsorted
    for(int i=1;i<n;i++)
    {
        value=a[i];
        hole=i;
        // shifting 
        while(hole>0&&a[hole-1]>value)
        {
            // 
            a[hole]=a[hole-1];
            hole=hole-1;
            count++;
        }
        a[hole]=value;
    }
    // cout << count<<endl;
}
// Return 0 to indicate normal termination
return 0;
 }