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;
}