1. 程式人生 > >Sort排序+STL佇列+優先佇列小結

Sort排序+STL佇列+優先佇列小結

    Sort排序:

        普通陣列:

                          sort排序比qsort排序簡單多了,這裡只對sort排序做了總結。

        標頭檔案:   #include<algorithm> using namespace std ;

                         sort(陣列名,陣列名+元素個數) ;例如:int/char/double  a[ 1000 ] ; 假設裡面已經賦了n個值,sort(a,a+n);這是從小到大排序。 sort(陣列名,陣列名+元素個數,cmp) ;int/char/double  cmp(int/char/double  a ,int/char/double  b ){    return  a > b ;    }從大到小排序。

       結構體排序:

       直接上程式碼:

#include<stdio.h>
#include<algorithm>
using namespace std;
struct zhang
{
    int x,y;
}t[1000];
bool cmp(zhang a,zhang b)
{
    return a.x > b.x ;//按x從大到小排序 "<"從小到大排序 同普通陣列
    // strcmp(a.s,b.s) > 0 ? 1 : 0 ; // 比較字串,大於0 降序,反之升序
}
int main()
{
     for(int i=0;i<10;i++)
       scanf("%d%d",&t[i].x,&t[i].y);
       sort(t,t+9,cmp);
    for(int i=0;i<9;i++)
      printf("%d %d\n",t[i].x,t[i].y);
    return 0;
}

  STL佇列:

      概念:  Queue佇列容器是一個先進先出的線性儲存表,元素的插入只能在隊尾,元素的刪除只能在隊首。

使用Queue需要宣告標頭檔案“#include <queue>  + using namespace std ”;

   基本運算:     

                 queue<int>q;申請q的佇列

                 q.push():入隊,即插入元素

                 q.pop():出隊,即刪除元素

                 q.front():讀取隊首元素

                 q.back():讀取隊尾元素

                 q.empty():判斷佇列是否為空,是返回 1 ,不是返回 0 。

                 q.size():隊列當前元素有多少

STL 棧 :

   概念: 棧和佇列其實差不多,棧是後進先出的一種線性儲存表。使用時需要申明標頭檔案“#include<stack> + using namespace std ”。不管棧還是佇列在做題時執行完一定要記得清空。

基本運算:

        stack<int>s ;申請棧

        s.push( ) : 入棧,即插入元素

        s.pop( ) : 出棧,即刪除元素

        s.top( ) : 讀取隊首元素(此處與佇列不同)

        s.empty( ) : 判斷佇列是否為空,是返回 1 ,不是返回 0 。

        s.size( ) : 棧當前元素有多少

  優先佇列:

    概念:  優先佇列和STL佇列不同之處就是優先佇列可以按照優先順序出隊(可以進行排序),在優先佇列中,優先順序高的元素先出佇列。標準庫預設使用元素型別的 < 操作符來確定它們之間的優先順序關係。如果不寫結構體預設為大的優先,如果想讓小的先出隊:priority_queue<int, vector<int>, greater<int> >qi2;

    基本運算:標頭檔案#include<queue> using namespace std;

#include<stdio.h>
#include<queue>
using namespace std;
struct zhang  
{  
   int x,y,z;  
     friend bool operator<(const zhang &a,const zhang &b)//operator後 " < " 很重要!!
    {  
            return a.x < b.x ;//從大到小出隊 " > " 從小到大出隊 
    }  
  
};  
priority_queue<zhang>q;//儘量把這個放進int main()裡
zhang current,next; 

比較多個數出隊:

#include<stdio.h>
#include<queue>
using namespace std;
struct zhang  
{  
   int x,y,z;  
     friend bool operator<(const zhang &a,const zhang &b)
    {  
        if(a.x!=b.x)
             return a.x < b.x ;//從大到小出隊 " > " 從小到大出隊(和普通排序相反) 
        else if(a.y!=b.y)
             return a.y > b.y ;//從大到小出隊
        else 
             return a.z < b.z ;
    }  
  
};  
priority_queue<zhang>q;
zhang current,next; 


不比較優先順序:

#include<stdio.h>
#include<queue>
using namespace std;
struct zhang
{
   int x,y,z;
};
queue<zhang>q;
zhang current,next;

deque(雙端佇列)

簡介:

         deque  雙端佇列容器 ( double - ended queue ) 與 vector 非常相似,deque 內部的資料機制和執行效能與 vector 不同,一般來說,當考慮到容器元素的記憶體分配策略和操作的效能時 ,deque 相對於 vector 較為有優勢。deque 雙端佇列採用分塊的線性結構來儲存資料,具有高效的刪除首位元素的函式,由於 deque 容器是以 deque 塊為單位進行記憶體的分配,並使用了二級的 Map 進行管理,因此不容易實現類似於 vector 的 capacity 和 reverse 函式,而且 deque 容器也不需要這樣的獲取和調整容大小的函式。

操作:

       建立:

         deque<型別>物件名;

         deque<int>q ;  // 建立一個空的deque物件; 

          deque<int>q(20) //建立具有n個元素的deque物件;

          deque<int>q(20 ,5) ;// 建立一個具有n個元素的deque物件,每個元素具有初始值(這裡為 5);

          deque<int> q(20 ,5) ; deque<int> p(q) ; //拷貝物件

           int a[10] = {1 ,2 ,3} ,deque<int> q(a ,a+3) ; // 拷貝區間的元素

    插入:

           q.push_front()  ; // 在頭部插入元素

           q.push_back() ; // 在尾部插入元素

    刪除:

            q.pop_front() ; // 刪除頭部元素

            q.pop_back() ; // 刪除尾部元素

             q.erase(q.begin() + x)  ;// 刪除某個位置的元素

             q.clear() ; // 清空容器

     遍歷:

            deque<int>::iterator i ,j ; // 遍歷器

     交換:

             q.swap(p) ; // 兩個容器的元素交換

     vector的功能deque差不多都延續過來了,這裡不再介紹。