基本順序表與元素外圍順序表
在程序中,需要將一組相同類型的元素進行管理和使用。其可以抽象爲線性表,
根據線性表的實際存儲方式,分爲兩種實現模型:
- 順序表:將元素順序地存放在一塊連續的存儲區裏,元素間的順序關係由它們的存儲順序自然表示。其索引是固定的,所以這樣的查找的複雜度爲O(1)
- 鏈表:將元素存放在通過鏈接構造起來的一系列存儲塊中。其內存不是連續的,如果要查找,需要一個一個的遍歷過去,所以這樣的存儲方式,查找的複雜度爲O(n)
列表與元組的實現
列表在Python中由C語言實現,是一個容量大小動態變化的數組,其內部主要由三個部分組成
(1)指針數組,存儲了所有列表元素的地址
(2)PyObject_VAR_HEAD Python中所有對象的基礎
(3)allocated 允許存放的元素數量。默認爲8,每當達到元素的一半時進行4倍的容量放大。
那麼既然列表的容量是動態可變的,那必然存在存儲容量的擴大。每次在擴大容量時,解釋器都會放出一個新的一段內存,遷移數據並釋放之前存儲元素的內存。
元組的實現與Python類似,只是不允許修改,一旦定義了一段元組不能修改或者添加刪除其中的元素。
字典的實現
原理同散列表,這裏不再贅述
集合的實現
原理同散列表,與字典不同的是沒有value值的存儲。Python中默認的有兩種集合
- set() 可變的,哈希的集合
- 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))