1. 程式人生 > 其它 >荷蘭國旗問題(利用基數排序思想實現)

荷蘭國旗問題(利用基數排序思想實現)

技術標籤:資料結構與演算法演算法資料結構連結串列

荷蘭國旗問題:設有一個僅由紅、白、藍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; } //收集 }