荷蘭國旗問題(利用基數排序思想實現)
阿新 • • 發佈:2020-12-16
荷蘭國旗問題:設有一個僅由紅、白、藍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;
} //收集
}