是否可以根据一个项目对列表进行排序?
例如,如果我有
1,3,2,4,5,6,7 ... 1000000
我知道3
是第二个元素,是否可以有效地将3
排序到2
和4
之间的正确位置,而无需重新排序整个列出?
编辑:我还应该注意,在这种情况下,假设列表的 rest 已经排序;它只是现在不合适的3
。
答案 0 :(得分:7)
你可以简单地找到无序对象(O(n)),取出对象(O(1)),找到正确的位置(O(n)),然后再次插入(O(1))。
假设C ++ 11,
#include <list>
#include <algorithm>
#include <iostream>
int main() {
std::list<int> values {1, 2, 3, 9, 4, 5, 6, 7, 12, 14};
auto it = std::is_sorted_until(values.begin(), values.end());
auto val = *--it;
// ^ find that object.
auto next = values.erase(it);
// ^ remove it.
auto ins = std::lower_bound(next, values.end(), val);
// ^ find where to put it back.
values.insert(ins, val);
// ^ insert it.
for (auto value : values) {
std::cout << value << std::endl;
}
}
在C ++ 11之前,您需要implement std::is_sorted_until
yourself。
答案 1 :(得分:1)
对于这个非常有限的情况,编写自己的bubblesort可能比std :: sort更快。
答案 2 :(得分:0)
如果你有这样的知识水平,为什么不自己交换项目而不是强迫sort
为你做这件事?
当然这是一种更好的方式。
即使您不知道它必须去哪里,您也可以快速找到它,将其删除,然后将其插入正确的位置。
答案 3 :(得分:0)
我想你可以使用insert
方法移动元素,但我想更多地了解你计算“正确”位置的方式:可能有更合适的算法。
答案 4 :(得分:0)
如果你考虑列表可能的遍历,那么它显然只是端到端的。所以:
vector
列表iterator
,则可以在vector
中进行二进制搜索。每个第N个元素,哈希表等的向量都是其他可能性。答案 5 :(得分:0)
这是如果你不使用std::list
。
使用Selection sort algorthm,如果您知道该范围,则只需对项目0到3(selectionSort(list,3)
)进行排序。
直到最后都不是整个范围。
示例代码:
#include <iostream>
using namespace std;
void selectionSort(int *array,int length)//selection sort function
{
int i,j,min,minat;
for(i=0;i<(length-1);i++)
{
minat=i;
min=array[i];
for(j=i+1;j<(length);j++) //select the min of the rest of array
{
if(min>array[j]) //ascending order for descending reverse
{
minat=j; //the position of the min element
min=array[j];
}
}
int temp=array[i] ;
array[i]=array[minat]; //swap
array[minat]=temp;
}
}
void printElements(int *array,int length) //print array elements
{
int i=0;
for(i=0;i<length;i++) cout<<array[i]<<" ";
cout<<" \n ";
}
int main(void)
{
int list[]={1,3,2,4,5,6}; // array to sort
int number_of_elements=6;
cout<<" \nBefore selectionSort\n";
printElements(list,number_of_elements);
selectionSort(list,3);
cout<<" \nAfter selectionSort\n";
printElements(list,number_of_elements);
cout<<" \nPress any key to continue\n";
cin.ignore();
cin.get();
return 0;
}
输出:
Before selectionSort
1 3 2 4 5 6
After selectionSort
1 2 3 4 5 6
Press any key to continue