快速排序的基本思想:
從序列當中選擇乙個基準數
在這裡我們選擇序列當中第乙個數作為基準數
將序列當中的所有數依次遍歷,比基準數大的位於其右側,比基準數小的位於其左側
重複步驟1.2,直到所有子集當中只有乙個元素為止。
以【4,2,5,3,7,9,0,1】為例,我們來模擬一趟快排的過程。1、初始化時,i指向鍊錶首元素4;j = i +1,指向2。基準數字為當前i 指向的數字:4。j4
2537
901i
2、隨後開始迴圈,j 當前指向2,因為2小於4,所以要把2移動到前面去。按照我們的演算法步驟操作:
執行一次交換後的結果如下:j4
2537
901i
3、接下來,由於 j 指向的值5 大於4,直接跳過,執行j++,此時 j 指向3j4
2537
901i
4、 j 指向的值為3,小於4,仿照步驟2,我們再次執行一次交換移動過程。
交換後的結果如下:j4
2357
901i
5、 j指向的值為7,大於4,所以直接跳過,執行 j++,j 指向9j4
2357
901i
6、同理,j 指向的值為9,也大於4,跳過,執行 j++,j 指向0j4
2357
901i
7、 j 指向的值為0,小於4,執行一次交換過程
交換後的結果如下:j4
2307
951i
8、 j 指向的值為1,小於4,我們再執行一次交換過程
交換後的結果如下:j4
2301
957i
9、最後,交換當前 i指向的值1,和4。得到【1、2、3、0、4、9、5、7】,一趟排序結束。j1
2304
957i
我們發現,4的左邊都是小於4的數字,右邊都是大於4的數字。
接下來,對左邊和右邊分別排序,不斷遞迴下去,直到元素全部有序。
// 鍊錶結點類
class
node()
: def __init__
(self, item=none)
: self.item = item // 資料域
self.next = none // 指標域
// 鍊錶類,生成鍊錶以及定義相關方法
class
linklist()
: def __init__
(self)
: self.head = none
// 生成鍊錶,這裡使用list來生成
def create
(self, item)
: self.head =
node
(item[0]
) p = self.head
for i in item[1:
]:p.next =
node
(i) p = p.next
// 遍歷顯示
def print
(self)
: p = self.head
while p != none:
print
(p.item, end=
' ')
p = p.next
print()
// 根據索引取值
def getitem
(self, index)
: p = self.head
count =
0while count != index:
p = p.next
count +=
1return p.item
// 根據索引設值
def setitem
(self, index, item)
: p = self.head
count =-1
while count < index-1:
p = p.next
count +=
1 p.item = item
// 互換
def swapitem
(self, i, j)
: t = self.
getitem
(j) self.
setitem
(j, self.
getitem
(i))
self.
setitem
(i, t)
def quicksortofloop
(self, left, right)
:if left < right:
// 初始化
i = left
j = i+
1 start = self.
getitem
(i)// 大迴圈條件,j不能超過鍊錶長度
while
(j <= right)
:// 如果 j 指向的值大於等於基準數字,直接跳過
while
(j <= right and self.
getitem
(j)>= start)
: j +=
1// 否則,j 指向的值小於基準,則交換
if(j <= right)
: i +=
1 self.
swapitem
(i, j)
self.
print()
j +=
1 self.
swapitem
(left, i)
self.
quicksortofloop
(left, i-1)
self.
quicksortofloop
(i+1
, right)
if __name__ ==
"__main__":l
=linklist()
l.create([
4,2,
5,3,
7,9,
0,1]
)l.quicksortofloop(0
,7)l
.print
()
4 2 5 3 7 9 0 14 2 3 5 7 9 0 1
4 2 3 0 7 9 5 1
4 2 3 0 1 9 5 7
1 0 3 2 4 9 5 7
0 1 3 2 4 9 5 7
0 1 2 3 4 9 5 7
0 1 2 3 4 9 5 7
0 1 2 3 4 7 5 9
0 1 2 3 4 5 7 9
參考:參考:
Python 實現單向鍊錶
鍊錶顧名思義就是 鏈 鍊錶是一種動態資料結構,他的特點是用一組任意的儲存單元存放資料元素。鍊錶中每乙個元素成為 結點 每乙個結點都是由資料域和指標域組成的。跟陣列不同鍊錶不用預先定義大小,而且硬體支援的話可以無限擴充套件。陣列需要預先定義大小,無法適應資料動態地增減,資料小於定義的長度會浪費記憶體,...
Python 實現單向動態鍊錶
鍊錶顧名思義就是 鏈 鍊錶是一種動態資料結構,他的特點是用一組任意的儲存單元存放資料元素。鍊錶中每乙個元素成為 結點 每乙個結點都是由資料域和指標域組成的。跟陣列不同鍊錶不用預先定義大小,而且硬體支援的話可以無限擴充套件。陣列需要預先定義大小,無法適應資料動態地增減,資料小於定義的長度會浪費記憶體,...
Python的單向鍊錶實現
思路 鍊錶由節點組成,先規定節點 node 包含data和指向下個節點的next 初始化data當然就是傳入的data了,next指向none 新增分兩種情況 鍊錶為空,那麼頭節點和尾節點都指向新插入的節點 鍊錶不為空,那麼直接在尾部新增即可 遍歷因為只有鍊錶的尾節點的next是指向none的,所以...