荷兰国旗问题:设有一个仅由红、白、蓝3种颜色的条块组成的条块序列。请编写一个时间复杂度为O(n)的算法,使得这些条块按红、白、蓝的顺序排好,即排成荷兰国旗图案。
算法设计
利用链式基数排序,将红、白、蓝3种颜色分配到3个链表上,然后对链表进行收集。
具体实现
typedef enum{Red,White,Blue}Color;
typedef struct ListNode{
Color color;
struct ListNode *next;
}Node,*LinkList;
void FlagAdjust(Color a[],int n)
// 将三种颜色组成的序列重排为按照红、白、蓝的顺序排列
{
LinkList list[3]; //创建3个链表,分别储存红、白、蓝色
int count = 0;
for(int i=0; i<3; i++){
list[i] = (Node*)malloc(sizeof(Node));
list[i]->next = NULL; //头结点指针域指向NULL
}
for(int i=0; i<n; i++){
if(a[i]==Red){
Node *p = (Node*)malloc(sizeof(Node));
p->color = Red;
p->next = list[Red]->next;
list[Red]->next = p;
}
else if(a[i]==White){
Node *p = (Node*)malloc(sizeof(Node));
p->color = White;
p->next = list[White]->next;
list[White]->next = p;
}
else{
Node *p = (Node*)malloc(sizeof(Node));
p->color = Blue;
p->next = list[Blue]->next;
list[Blue]->next = p;
}
} //分配
Node *q = list[Red]->next;
while(q!=NULL){
a[count] = q->color;
count++;
q = q->next;
}
q = list[White]->next;
while(q!=NULL){
a[count] = q->color;
count++;
q = q->next;
}
q = list[Blue]->next;
while(q!=NULL){
a[count] = q->color;
count++;
q = q->next;
} //收集
}
荷兰国旗问题通过基数排序算法解决,将红、白、蓝条块分别放入三个链表,最后依次收集,实现时间复杂度为O(n)的排序效果。
&spm=1001.2101.3001.5002&articleId=111239152&d=1&t=3&u=1de8e53ea6544874ad76b8fc61c0113d)
722

被折叠的 条评论
为什么被折叠?



