氣泡排序是一種基礎而又簡單的排序方法,它能夠很好地鍛鍊新手思維能力,同樣地,在鍊錶的氣泡排序中,它能夠鍛鍊我們鍊錶的熟悉使用和對鍊錶資料的處理方法。
在對單鏈表進行氣泡排序之前,我們得先掌握三個基礎知識。
●氣泡排序
氣泡排序的基本方法是通過兩兩比較,每一趟比較中都會把乙個較大的數往後移。
例如:一組數:5,4,3,2,1 從小到大排序
第一趟比較中:先對第乙個數5和4對比,然後5>4,那麼資料交換,然後對第二個數5對第三個數3進行對比,5>3,資料交換,一直這樣對比下去,直到這組資料中
5移到了最後一位,即這組數變為:4,3,2,1,5;
然後我們在重複第一趟的步驟,依次比較,然後就把4移到了5的前面;變成3,2,1,4,5;
依次重複(5-1)次
....................
最後變為了:1,2,3,4,5;
迴圈分析:對於i個數,我們要進行(i-1)趟比較,然後每一趟迴圈中,我們實際只需要進行(j-i-1)次比較,因為我們第一趟把5移到最後,我們知道了5是這組資料中的
最大值,然後第二趟迴圈中我們就不用和5進行比較,依次類推下去。
●鍊錶節點的交換
氣泡排序的過程,實際上也是交換的過程,只不過在鍊錶中我們交換的不是資料而是節點,雖然同樣可以通過交換資料的方式達到冒泡的結果,但如果節點中的資料非
常多時,效率就會變得非常低,況且這種實現方式並不能帶給我們知識上的幫助。所以我們來看看鍊錶節點的交換。
node* swap(node* head)
q=p; //q指標在p指標前面
p=p->next; //p指標後移
} return head;
}
具體的鍊錶交換圖如下:
當然,這個函式並沒有包含輸入尾節點時的交換,因為我們每一次比較的時候都是和下乙個數進行對比,當我們輸入倒數第二個數的時候就已經和最後乙個數進行對
比交換了。如果鍊錶不熟悉的話,建議大家畫圖分析。
●氣泡排序在鍊錶中的實現
其實如果懂得上面兩種知識之後,就可以很容易實現了,我們只需要獲取了資料的總數量之後,然後在迴圈中進行節點的資料的判斷並進行交換即可,實現方法如下:
node* maopao(node* head)
//氣泡排序的基本思路
for(int i=0;inext!=null&&j!=0)
q=p; //為了能讓q保持在p的前面
p=p->next; //p指標後移,即p變成了在q的前面
}} return head;
}
單鏈表氣泡排序
一.題目 如題.二.package week 4 單鏈表氣泡排序 author dingding date 2017 7 3 12 25 public class sortlink solution,氣泡排序,直接交換兩個值,關鍵在於迴圈條件 private static node sort nod...
單鏈表 氣泡排序
main.c bubblesortlinkedlist headnode created by chenyufeng on 16 3 1.對帶頭結點的單鏈表進行氣泡排序,並列印 include include include typedef int elemtype typedef struct n...
單鏈表氣泡排序
今天做鍊錶排序有個誤區,就是以為交換的時候要連next節點也交換,還要固定head節點,想了很久也沒做出來,但是後來看網上的提示,才知道只要交換節點內的資料就可以了,根本不用交換next節點 include include struct node struct node create list in...