插入排序优化

时间:2014-06-19 07:20:05

标签: c++ optimization vector insertion-sort

我试图练习制作一些不同的排序功能,而我想出的插入功能给我带来了一些麻烦。我可以很快地对小于30K的列表进行排序。但我有一个100K整数的列表,它完成排序的功能需要15分钟。一切都正确排序,但我不相信它应该花那么长时间。

我错过了使用我的代码会花费这么长时间的东西吗?提前谢谢了。

void Sort::insertion_Sort(vector <int> v)
{
    int vecSize = v.size(); 

    //for loop to advance through the vector
    for (int i=0; i < vecSize; i++)
    {
        //delcare some variables 
        int cursor = i; 
        int inputCursor = i-1; 
        int temp = v[cursor]; 

        //check to see if we are considering only a single element 
        if (cursor > 0)
        {
            //if there is more than 1 element, then we test the following. 
            //1. is the cursor element less than the inputCursor(which 
            //is the previous element) 
            //2. is the input cursor greater than -1
            while (inputCursor > -1 && v[cursor] < v[inputCursor] )
            {

                    //if so, we swap the variables 
                    //then move the cursors back to check 
                    //the previous elment and see if we  need to swap again. 
                    temp = v[cursor];
                    v[cursor] = v[inputCursor];
                    v[inputCursor] = temp;
                    inputCursor--;
                    cursor--; 
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

插入排序是O(n^2)算法。大输入的速度很慢。与30k项目列表相比,处理100k项目列表需要大约11倍的时间。对于大于20左右的输入,您应该使用类似于快速排序的内容,即O(n*log(n))

答案 1 :(得分:0)

正如另一个答案所指出的,O(n^2) vs O(n*log(n))问题是这个问题的核心。我建议使用二进制搜索算法,因为它更类似于插入算法,并且实现起来更简单。它会寻找将已插入的向量分成两半的插入点,并试图查看要插入的整数是否大于中间的整数。然后,它将再次尝试分割一半(选择侧的那个),依此类推,递归。

我认为这是最好的方法而不是从头开始。