python 單向鍊錶實現快速排序

2021-09-02 00:27:54 字數 3598 閱讀 8906

快速排序的基本思想:

從序列當中選擇乙個基準數

在這裡我們選擇序列當中第乙個數作為基準數

將序列當中的所有數依次遍歷,比基準數大的位於其右側,比基準數小的位於其左側

重複步驟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 1

4 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的,所以...