排序队列 - C / C ++

时间:2015-01-19 11:26:44

标签: c++ sorting queue

我创建了一个队列,在每个节点中有三个信息。我想在类中创建一个成员函数,在调用时对队列进行排序。我希望队列按时间排序? (它是一个int和q_node的成员)。需要对此队列进行排序,以使“时间”的最低值排序。在前面,它按递增顺序排序。 我的队列代码如下:

typedef struct Qnode{
    int time;
    char name[10];
    char value;

    struct Qnode *q_next;
    struct Qnode *q_prev;
} q_node;

class Queue{
private:
    q_node *q_rear;
    q_node *q_front;
    int number;
public:
    Queue();
    void enqueue(int time, char *s, char value);
    q_node *q_top(){
        return q_front;
    }
    void dequeue();
    void display();
    void queueSort();
    bool isEmpty();
};

Queue::Queue(){
    q_rear = NULL;
    q_front = NULL;
    number = 0;
}

bool Queue::isEmpty(){
    if (q_front == NULL)
        return true;
    else
        return false;
}

void Queue::enqueue(int t, char *n, char v){
    q_node *q_temp = new q_node;

    q_temp->time = t;
    strcpy(q_temp->name , n);
    q_temp->value = v;
    q_temp->q_next = NULL;

    if(q_front == NULL){
        q_front = q_temp;
    }
    else{
        q_rear->q_next = q_temp;
    }
    q_rear = q_temp;
    number++;
}

void Queue::dequeue(){
    q_node *q_temp = new q_node;
    q_temp = q_front;
    q_front = q_front -> q_next;
    number--;
    delete q_temp;
}


void Queue::display(){
    q_node *p = new q_node;
    p = q_front;
    while(p!=NULL){
        cout<< "\ntime: " << p->time;
        cout<< "\nname: " << p->name;
        cout<< "\nvalue: " << p->value;
        cout << endl;
        p = p->q_next;
    }
}

void Queue::queueSort(){
    //Code for sorting

}

2 个答案:

答案 0 :(得分:1)

一种方法是使用dequeue将队列转储到数组或向量中,使用std::sort,然后使用enqueue函数从头开始重建队列。这很干净,避免弄乱指针。这也是最佳选择,因为运行时间主要取决于排序所需的时间。

类似的东西:

v = vector of nodes
while(Q.isEmpty() == false)
{   v.push_back(*Q.top());
    Q.dequeue();
}

sort(v.begin(), v.end(), cmp);

for(int i = 0; i < v.size(); i++)
{   Q.enqueue(v[i].time, v[i].name, v[i].value);
}

cmp按时间比较节点。

答案 1 :(得分:0)

找到具有最小time字段的节点,将其从列表中删除并使其成为新列表的头部。然后继续执行此操作,在原始列表不为空的情况下将节点附加到新列表中。当原始列表为空时,采用新的(已排序的)列表并将其设为新队列。

它可能效率不高,但应该可以正常工作。