/*
name: 拓撲排序之變數序列(三種演算法實現)
author:
date: 17-11-14 21:02
description: 拓撲排序之變數序列
假設有n個變數(1<=n<=26,變數名用單個小寫字母表示),還有m個二元組(u,v),分別表示變數u小於v。
那麼,所有變數從小到大排列起來應該是什麼樣子的呢?
例如有4個變數a,b,c,d,若以知a#include#define true 1
#define false 0
#define maxm 26 //最大變數(頂點)數量
#define maxn 100000 //最大關係式數量
typedef char vertextype; //頂點型別由使用者自定義
typedef int edgetype; //邊上的權值型別由使用者自定義
typedef struct edgenode edgenode;
typedef struct vertexnode vertexnode;
int book[maxm] = ; //標記某字母是否出現
int color[maxm] = ;//儲存頂點的顏色,白色(0)表示未訪問,灰色(1)表示已訪問,黑色(2)表示已完成訪問
int istoposeq(char *data, char *topo);//根據關係列表data,判斷topo字串是否為拓撲序列
int creategraph(char *data, vertexnode *gl);//建立乙個圖
void printgraph(vertexnode *gl);//輸出圖
int topologicalsort_dfs(char *topo, vertexnode *gl, int n);//拓撲排序,獲取拓撲序列,若存在環則返回假
int topologicalsort_bfs(char *topo, vertexnode *gl, int n);//拓撲排序,獲取拓撲序列,若存在環則返回假
int topologicalsort_dfs_color(char *topo, vertexnode *gl, int n);//拓撲排序,獲取拓撲序列,若存在環則返回假
int dfs_color(char *topo, vertexnode *gl, int *top, int u);//使用深度優先搜尋方法構造逆序拓撲序列
int main()
/*函式名稱:creategraph
函式功能:把頂點和邊資訊讀入到表示圖的鄰接表中
輸入變數:char *data:儲存了n個關係式的字串
vertexnode *gl : 頂點表陣列
輸出變數:表示圖的頂點表陣列
返回值:int :頂點數量
*/ int creategraph(char *data, vertexnode *gl)
for (i=0; inext)//將u的鄰接點入度減1,並將入度為0的頂點入棧
printf("\n");
} printf("\n");
} /*
函式名稱:topologicalsort_dfs
函式功能:拓撲排序,採用深度優先搜尋獲取拓撲序列
輸入變數:char *topo:用來儲存拓撲序列的字串
vertexnode *gl : 頂點表陣列
int n:頂點個數
輸出變數:用來儲存拓撲序列的字串
返回值:int :拓撲排序成功返回真,若存在環則返回假
*/ int topologicalsort_dfs(char *topo, vertexnode *gl, int n)
} topo[count] = '\0';
return (count == n);//如果count小於頂點數,說明存在環 }/*
函式名稱:topologicalsort_bfs
函式功能:拓撲排序,採用廣度優先搜尋獲取拓撲序列
輸入變數:char *topo:用來儲存拓撲序列的字串
vertexnode *gl : 頂點表陣列
int n:頂點個數
輸出變數:用來儲存拓撲序列的字串
返回值:int :拓撲排序成功返回真,若存在環則返回假
*/ int topologicalsort_bfs(char *topo, vertexnode *gl, int n)
} topo[rear] = '\0';
return (rear == n);//如果count小於頂點數,說明存在環
}int istoposeq(char *data, char *topo)//根據關係列表data,判斷topo字串是否為拓撲序列
; int i;
for (i=0; topo[i]!='\0'; i++)//讀取變數下標
pos[topo[i]-'a'] = i;
for (i=0; data[i]!='\0'; i+=2)//每次讀取兩個變數
return true;}/*
函式名稱:topologicalsort_dfs
函式功能:拓撲排序,採用深度優先搜尋判斷反向邊演算法獲取拓撲序列
輸入變數:char *topo:用來儲存拓撲序列的字串
vertexnode *gl : 頂點表陣列
int n:頂點個數
輸出變數:用來儲存拓撲序列的字串
返回值:int :拓撲排序成功返回真,若存在環則返回假
*/ int topologicalsort_dfs_color(char *topo, vertexnode *gl, int n)
if (color[e->adjvex] == 0)
}color[u] = 2; //printf("%c)", u+'a');
topo[(*top)++] = u; //加入拓撲序列,注意是逆序
return flag;
}
三種排序演算法及三種變數交換的巨集實現
1 快速排序 include include include define n 100 define swap x,y intpartition int a,int l,int r void quick sort int a,int l,int r intmain int argc,char arg...
三種排序演算法
1.氣泡排序法 2.選擇排序法 3.插入排序法 由小到大的順序 備註 網上筆試題,是參考網上別人的,具體出處找不到了,請諒解。摘抄記錄下來方便日後學習。如果有問題盡請批評指正,希望可以和大神一起交流。氣泡排序的最好的時間複雜度為o n 最壞的時間為 o n 2 演算法的平均時間複雜度為o n 2 選...
三種基本排序演算法
示例陣列 以公升序為例 for int i 0 i arr.length i 輪數 第一次 j下標從0開始,第0位與第1位相比較,當第0位大於第1位時 3 1 進行交換。交換完陣列為 第二次j為1,第1位與第2位比較,3 5,不交換。第三次j為2,第2位與第3位比較,5 2,交換。陣列為 第四次j為...