确定插入排序中执行的班次数量?

时间:2016-02-04 18:18:40

标签: c++ arrays sorting insertion-sort

我正在尝试解决这个问题http://www.mycodeschool.com/work-outs/sorting/7 问题是在插入排序中找到没有变化。

我已编写代码,但无法弄清楚我在逻辑中出错的地方

http://ideone.com/GGjZjw

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

2 个答案:

答案 0 :(得分:2)

插入排序中的交换次数等于数组中inversions的数量(乱序的元素对数)。有一个well-known divide-and-conquer algorithm用于计算在时间O(n log n)内运行的数组中的反转次数。它基于一个稍微修改过的mergesort版本,我认为编写它不会有太多麻烦。

答案 1 :(得分:0)

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

与@templatetypedef的O(n log n)解决方案相比,复杂性稍差(但复杂程度更低:P),您可以通过应用正确的实现以相同的排序O(n^2)复杂度来解决它。 / p>

你应该为swap(int* array, int index_a, int index_b)实现一个函数,而不是计算这个函数的调用次数。

这个Link维基百科有一个很好的伪代码