求队列数据结构,函数含义解释
这个函数pqueue_sort_key(Pqueue pq1, Pqueue pq2)
到底是怎样进行排序的啊,是什么意思,求教?
- C/C++ code
/*排序队列通过key*/voidpqueue_sort_key(Pqueue pq1, Pqueue pq2){ int k, j; for (k = 1; k <= pq1->count; k++) { /* 查找键*/ if (pq1->key[k] != pq2->key[k]) { /*不对应*/ for (j = 1; j <= pq2->count; j++) { /*查找那个正确的*/ if (pq1->key[k] == pq2->key[j]) { /* 找到! */ swap(&pq2->h[k], &pq2->h[j]); swap(&pq2->key[k], &pq2->key[j]); } } } }}
在数据结构整个定义里
- C/C++ code
/*优先级队列定义*/#include <stdio.h>#include <stdlib.h>#include "item.h"#include "pqueue.h"typedef Item *Heap;struct pqueue { Heap h; int *key; int size, count;};/*执行交换信息*/static voidswap(int *i, int *j){ int tmp; tmp = *i; *i = *j; *j = tmp;}/*返回父节点的键*/static intfather(Pqueue pq, int i){ if (pq == NULL) { fprintf(stderr, "father(): non esiste una coda\n"); return (-1); } if (i >= 2 && i <= pq->count) { return (i / 2); } return (i);}/*创建新队列*/Pqueuepqueue_new(int n){ Pqueue pq; int i; if (n == 0) { exit(EXIT_SUCCESS); } if ((pq = malloc(sizeof(struct pqueue))) == NULL) { fprintf(stderr, "Error: malloc()\n"); exit(EXIT_FAILURE); } if ((pq->h = malloc((n + 1) * sizeof(Item))) == NULL) { fprintf(stderr, "Error: malloc()\n"); exit(EXIT_FAILURE); } if ((pq->key = malloc((n + 1) * sizeof(Item))) == NULL) { fprintf(stderr, "Error: malloc()\n"); exit(EXIT_FAILURE); } for (i = 0; i < (n + 1); i++) { pq->h[i] = 0; pq->key[i] = i; } pq->size = (n + 1); pq->count = 0; return (pq);}/*向队列里插入新值,自动调整其,符合堆的定义*/voidpqueue_insert(Pqueue pq, Item item){ int pos; if (pq == NULL) { fprintf(stderr, "pqueue_insert(): non esiste una coda\n"); return; } pos = (pq->count + 1); if (pos < pq->size) { /* Imposta valore */ pq->h[pos] = item; pq->count++; heapify_up(pq, pos); } else { fprintf(stderr, "pqueue_insert(): coda piena\n"); return; }}/*从上往下调整其为堆*/static voidheapify_up(Pqueue pq, int i){ int j; if (pq == NULL) { fprintf(stderr, "heapify_up(): non esiste una coda\n"); return; } if (i > 1) { j = father(pq, i); if (cmp(pq->h[i], pq->h[j]) < 0) { swap(&(pq->h[i]), &(pq->h[j])); swap(&(pq->key[i]), &(pq->key[j])); heapify_up(pq, j); } }}
[解决办法]
pq1的Key是: 5, 11, 9, 3, 2, 7, 1, 6, 10, 8, 4, 12
pq2的Key是: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
pq2: 11, 24, 13, 33, 11, 15, 23, 35, 16, 29, 7, 26
首先 pq1的第一个key和pq2的第一个key进行比较,pq1的key是5,pq2的key是1,不相等。从pq2的key中查找与5相等的key,结果pq2中第五个key等于5,所以就把pq2中的第一项与pq2中的第五项互相交换,结果如下:
pq1的Key是: 5, 11, 9, 3, 2, 7, 1, 6, 10, 8, 4, 12
pq2的Key是: 5, 2, 3, 4, 1, 6, 7, 8, 9, 10, 11, 12
pq2: 11, 24, 13, 33, 11, 15, 23, 35, 16, 29, 7, 26
然后第二次循环 pq1的第二个key和pq2的第二个key进行比较,pq1的key是11,pq2的key是2,不相等。从pq2的key中查找与11相等的key,结果pq2中第11个key等于11,所以就把pq2中的第二项与pq2中的第11项互相交换,结果如下:
pq1的Key是: 5, 11, 9, 3, 2, 7, 1, 6, 10, 8, 4, 12
pq2的Key是: 5, 1, 3, 4, 1, 6, 7, 8, 9, 10, 2, 12
pq2: 11, 7, 13, 33, 11, 15, 23, 35, 16, 29, 24, 26
然后第三次循环 pq1的第3个key和pq2的第3个key进行比较,pq1的key是9,pq2的key是3,不相等。从pq2的key中查找与9相等的key,结果pq2中第9个key等于9,所以就把pq2中的第三项与pq2中的第九项互相交换,结果如下:
pq1的Key是: 5, 11, 9, 3, 2, 7, 1, 6, 10, 8, 4, 12
pq2的Key是: 5, 1, 9, 4, 1, 6, 7, 8, 3, 10, 2, 12
pq2: 11, 7, 16, 33, 11, 15, 23, 35, 13, 29, 24, 26
然后第四次循环 pq1的第4个key和pq2的第4个key进行比较,pq1的key是3,pq2的key是4,不相等。从pq2的key中查找与3相等的key,结果pq2中第9个key等于3,所以就把pq2中的第四项与pq2中的第九项互相交换,结果如下:
pq1的Key是: 5, 11, 9, 3, 2, 7, 1, 6, 10, 8, 4, 12
pq2的Key是: 5, 1, 9, 3, 1, 6, 7, 8, 4, 10, 2, 12
pq2: 11, 7, 16, 13, 11, 15, 23, 35, 33, 29, 24, 26
现在已经经历四次循环了,然后继续循环,按照上面的方法进行排序,就得到上面的结果了。