我试图练习制作一些不同的排序功能,而我想出的插入功能给我带来了一些麻烦。我可以很快地对小于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--;
}
}
}
}
答案 0 :(得分:1)
插入排序是O(n^2)
算法。大输入的速度很慢。与30k项目列表相比,处理100k项目列表需要大约11倍的时间。对于大于20左右的输入,您应该使用类似于快速排序的内容,即O(n*log(n))
。
答案 1 :(得分:0)
正如另一个答案所指出的,O(n^2)
vs O(n*log(n))
问题是这个问题的核心。我建议使用二进制搜索算法,因为它更类似于插入算法,并且实现起来更简单。它会寻找将已插入的向量分成两半的插入点,并试图查看要插入的整数是否大于中间的整数。然后,它将再次尝试分割一半(选择侧的那个),依此类推,递归。
我认为这是最好的方法而不是从头开始。