使用c + +排序列表中的元素而不使用list_name.sort()

时间:2015-08-26 14:34:33

标签: c++ list sorting

在此代码中,右手(rh)有未分类的数字;而我正在尝试排序

左手使用特定算法;

算法:右手有未分类的数字;左手是得到结果(排序的数字)

  1. 从右手拿第一个数字到左手
  2. 因此排序:

    1. 如果左手中的最后一个数字大于左手中的下一个数字,请提前一步并比较

    2. 否则在左侧的当前数字后面的一个位置插入数字。

    3. 例如

      lh:5 1 3 6 7 6

      rh:next lh:1 3 6 7 9 6

      rh:5 //最后一个位置= 5

      下一个:(5> 1)==> rh:1 5 //最后位置= 5

      下一个:(5> 3)==> rh:1 3 5 //最后一个位置= 5

      下一个:(5< 6)==> rh:1 3 5 6 //最后位置= 6

      下一个:(6< 7)==> rh:1 3 5 6 7 //最后位置= 7

      下一个:(7< 6,但6!> 6)==> rh:1 3 5 6 6 7 //最后位置= 6

      SORTED !!!

      我用谷歌搜索,阅读了一些pdf,并实现了所显示的内容,但我无法弄清楚,我是否实施错误?

      //rh= right hand
      //lh= left hand
      #include <iostream>
      #include <cstdlib>
      #include <list>
      using namespace std;
      
      int main()
      {
          cout<<"Enter numbers into the left hand: ";
          list<int> rh;
          int numb;
          //Entering elements into list
          while(cin>>numb)
              rh.push_back(numb);
          //Display entered elements
              //declaring an iterator
          cout<<"You have enterred: ";
          list <int> :: iterator i;// for rh
          int t;//to get first element of rh
          for(i=rh.begin(); i!=rh.end(); i++)
          {
              cout<<*i<<" ";     
          }
          cout<<endl;
          cout<<"Sorting...."<<endl;
          list <int> lh;
          list <int> :: iterator j;
          //delete the first element of rh, as it's assigned to lh
          t=*rh.begin();
          lh.push_back(t);
          rh.pop_front();
           for(i=rh.begin(); i!=rh.end(); i++)
              { list<int>:: iterator temp=lh.begin();
                   for(j=lh.end(); j!=lh.begin(); j--)
                  { //this is where i am not sure of
                        if(*j<*i){temp++; rh.insert(temp,*i);}
                          else
                          { //insert the value of i at the position j+1
                           //i.e insert the incoming number one position after the present one(in rh)
                               continue;
                          }
                      temp++;
                  }
              }
          lh.unique();//remove duplicate copies
          for(j=lh.begin(); j!=lh.end(); j++)
              cout<<*j<<" ";
          cout<<endl;
          cout<<"-------- !!!! DONE !!!!--------";cout<<endl;
          system("pause");
      return 0;
      }
      

1 个答案:

答案 0 :(得分:0)

原始问题的两次表明rh具有未分类的数字,但是示例注释反转了这一点,显示了带有未分类数字的lh。以下是执行所描述内容的示例代码,但与示例文本和示例代码不同。也许原始海报可以通过说明下面的代码与代码应该如何不同来解释实际目标是什么。请注意,list.insert()可以在空列表中使用。

    list <int> lh;
    list <int> rh;
    list <int>::iterator l, r;
    rh.push_back(1);
    rh.push_back(0);
    rh.push_back(6);
    rh.push_back(7);
    rh.push_back(4);
    rh.push_back(2);
    rh.push_back(3);
    rh.push_back(5);
    while(rh.size()){
        r = rh.begin();
        for(l = lh.begin(); l != lh.end(); l++)
            if(*l > *r)
                break;
        lh.insert(l, *r);
        rh.pop_front();
    }