在用python寫快速排序法時,需要選定陣列最後乙個數值,將小於等於它的放在左側,大於它的放在右側。
其實方法很簡單,遍歷一邊陣列,將數值小於等於它的放到乙個陣列,大於它的放到另乙個陣列,最後以小於它的陣列,它,大於它的陣列合併。
這樣做無疑是對的,但這樣過於浪費空間,為了設計更高效的演算法,我們本不需要申請額外的空間。
有這樣乙個思路,使用變數i遍歷列表,在使用變數j指向列表第乙個元素,變數j的作用是將陣列一分為二,0-j存放是小於等於指定值的數,相反j+1 - n-1(n為陣列長度)存放大於指定值的數。這樣就不需要申請額外的空間。
具體變數j的操作,每個陣列裡的數都與指定數比較,如果小於等於指定數,就交換a[i],a[j],同時j遞增1,因為i(固定遞增1)遞增的速度一定大於j,所以小值全被換到了前面,最後當a[i] = a[n-1]時,一定會發生a[i]和a[j]的交換,到這裡就結束了。
j = st #st為列表首索引,fi為列表尾索引
for i in range(st,fi+1):
if arr[i] <= arr[fi]:
temp = arr[j]
arr[j] = arr[i]
arr[i] =temp
j += 1
i += 1
重排列表(學習筆記2020 10 20)
給定乙個單鏈表 l l0 l1 ln 1 ln 將其重新排列後變為 l0 ln l1 ln 1 l2 ln 2 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。示例 1 給定鍊錶 1 2 3 4,重新排列為 1 4 2 3.示例 2 給定鍊錶 1 2 3 4 5,重新排列為 1 5 2...
leetcode第143題 重排列表
給定乙個單鏈表 l l0 l1 ln 1 ln 將其重新排列後變為 l0 ln l1 ln 1 l2 ln 2 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。示例 1 給定鍊錶 1 2 3 4,重新排列為 1 4 2 3.示例 2 給定鍊錶 1 2 3 4 5,重新排列為 1 5 2...
多重排列問題
輸出1 m個數中取n個數的所有多重排列。例如n 2,m 3的所有多重排列為 1 11 21 3 2 12 2 2 33 1 3 23 3 include include include include include include include include include include i...