std :: list - 排序一个项目

时间:2012-10-16 10:59:25

标签: c++ list sorting stl

是否可以根据一个项目对列表进行排序?

例如,如果我有

1,3,2,4,5,6,7 ... 1000000

我知道3是第二个元素,是否可以有效地将3排序到24之间的正确位置,而无需重新排序整个列出?

编辑:我还应该注意,在这种情况下,假设列表的 rest 已经排序;它只是现在不合适的3

6 个答案:

答案 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