Python語言基礎(六)內存結構與排序算法

基本順序表與元素外圍順序表

在程序中,需要將一組相同類型的元素進行管理和使用。其可以抽象爲線性表,
根據線性表的實際存儲方式,分爲兩種實現模型:

  • 順序表:將元素順序地存放在一塊連續的存儲區裏,元素間的順序關係由它們的存儲順序自然表示。其索引是固定的,所以這樣的查找的複雜度爲O(1)
  • 鏈表:將元素存放在通過鏈接構造起來的一系列存儲塊中。其內存不是連續的,如果要查找,需要一個一個的遍歷過去,所以這樣的存儲方式,查找的複雜度爲O(n)

列表與元組的實現

列表在Python中由C語言實現,是一個容量大小動態變化的數組,其內部主要由三個部分組成
(1)指針數組,存儲了所有列表元素的地址
(2)PyObject_VAR_HEAD Python中所有對象的基礎
(3)allocated 允許存放的元素數量。默認爲8,每當達到元素的一半時進行4倍的容量放大。
那麼既然列表的容量是動態可變的,那必然存在存儲容量的擴大。每次在擴大容量時,解釋器都會放出一個新的一段內存,遷移數據並釋放之前存儲元素的內存。

元組的實現與Python類似,只是不允許修改,一旦定義了一段元組不能修改或者添加刪除其中的元素。

字典的實現

原理同散列表,這裏不再贅述

集合的實現

原理同散列表,與字典不同的是沒有value值的存儲。Python中默認的有兩種集合

  1. set() 可變的,哈希的集合
  2. frozenset() 不可變的,哈希的集合

這兩者都是不可重複的。

排序算法之快速排序

(1)取最左邊的元素爲標杆,從左向右查找比標杆大的元素,從右向左查找比標杆小的元素。如果兩個指針沒有相遇則交換位置所在的元素。如果相遇則交換相遇點與標杆元素。
(2)至此,相遇點左邊的元素都是小於標杆元素的,相遇點右邊的元素都是大於標杆元素的。
(3)將標杆左邊的數組和右邊的數組分別做循環即可

l1 = [15, 4, 10, 8, 20, 30]


def quickSort(l, left, right):
    if left < right:
        k = partition(l, left, right)
        quickSort(l, left, k-1)
        quickSort(l, k+1, right)
    return l


def partition(l: list, left: int, right: int) -> object:
    tmp_num = l[left]
    tmp_left_flag = left
    tmp_right_flag = right
    while tmp_left_flag < tmp_right_flag:
        while l[tmp_left_flag] < tmp_num:
                tmp_left_flag += 1

        while l[tmp_right_flag] > tmp_num:
                tmp_right_flag -= 1

        if tmp_left_flag < tmp_right_flag:
            l[tmp_left_flag], l[tmp_right_flag] = l[tmp_right_flag], l[tmp_left_flag]

        if tmp_left_flag == tmp_right_flag:
            l[tmp_left_flag], tmp_num = tmp_num, l[tmp_left_flag]
            return tmp_left_flag

    return tmp_left_flag


def switch(left, right):
    tmp = left
    left = right
    right = tmp
    return [left, right]


print(quickSort(l1, 0, len(l1) - 1))

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章