總結在利用單鏈表做學生資訊管理系統的時候發現了乙個一直忽略乙個問題,就是在單鏈表中如何進行排序的問題,我們知道在順序表中可以很輕易的利用氣泡排序或者歸併排序等各種演算法輕易實現排序,但在單鏈表中該如何進行排序引起了我的思考。在一番思索過後,我暫時給出了兩種基本的解決方案,這兩種方案我都放在了之前的一篇文章中,詳細**可以參考資料結構——(線性表之單鏈表)學生資訊應用這篇文章。
演算法a
**如下
void
orderbylist
(list *l)
//根據成績對學生資訊進行排序,排序思路:在鍊錶內進行氣泡排序
p = p->next;}}
}
演算法b**如下
void
orderbylist
(list *l)
/*根據成績對學生資訊進行排序, 排序思路:先將鍊錶資料域賦值到結構體陣列中,然後在陣列中排序完再重新
賦值回鍊錶資料域*/
for(
int i =
0; i < count; i++)}
} p = l->next;
for(
int i =
0; i < count; i++
)}
**如下:
#include
#include
#include
using namespace std;
#define num 10000
#pragma warning(disable:4996)
intmain()
dword endtime =
gettickcount()
;//計時結束
cout <<
"the run time is:"
<< endtime - starttime <<
"ms"
<< endl;
cout <<
getlength
(l)<< endl;
system
("pause");
destroylist
(l);
return0;
}
演算法a的時間記錄:
演算法b的時間記錄:
根據以上的實驗結果可以很明顯的看出來,演算法a的時間遠大於演算法b,即演算法b更好。
進一步可以得出,在鍊錶中的排序時間複雜度要遠高於在順序表中的時間複雜度,所以較為快速的排序方法是把單鏈表中的所有資料域全部取出放到結構體陣列中進行排序,再按照順序重新錄入鍊錶
C 單向鍊錶的排序
首先,要建立一些無序的單向鍊錶用於測試。public class listnode class program rdm return head.next static void main 每次迴圈都對比相鄰兩個節點的大小,當下乙個節點比當前節點大時,就進行交換操作。每個內迴圈只執行一次交換操作。外迴...
單向鍊錶逆序問題
問題 將乙個單向單向鍊錶逆序倒轉,要求o n 的時間複雜度和o 1 的空間複雜度 該問題有兩種解法,一種非遞迴,一種是遞迴,如下 include include link.h typedef struct linknode linknode 遞迴 linknode reverselink linkn...
單向鍊錶的查詢問題
題目 輸入乙個單向鍊錶。如果該鍊錶的結點數為奇數,輸出中間的結點 如果鍊錶結點數為偶數,輸出中間兩個結點前面的乙個。思考 最簡單的解法 從頭到尾遍歷一遍陣列,得到鍊錶大小n。然後再從頭走n 2次,則一共需要的時間為1.5n。優化 想起以前一道題目,用n的方法反轉乙個單向鍊錶。如果只用乙個變數head...