# 快速排序法
class solution:
def sort(self,a):
first = 0
last = len(a) - 1
# 這裡需要注意的是,需要將a整體作為迭代變數
# 因此也需要將first和last作為迭代變數
# 這是因為python中輸入陣列後,如果分割陣列作為下一次迭代,原陣列是不會變的
self.start_sort(a,first,last)
return a
def start_sort(self,a,first,last):
if first < last:
# 以第一元素作為閾值
key = a[first]
i = first
j = last
while i < j:
# 從後向前,尋找小於閾值的元素(注意這裡的》=)
while i= key:
j = j - 1
# 將小於閾值的元素賦值給靠前的a[i]
a[i] = a[j]
# 從前向後,尋找大於閾值的元素(注意這裡的<=)
while ii = i + 1
# 將大於閾值的元素賦值給靠後的a[j]
a[j] = a[i]
# 將閾值賦值給第i個元素,這樣可以保證,i之前的陣列均小於a[i],i之後的陣列均大於a[i]
a[i] = key
self.start_sort(a,first,i-1)
self.start_sort(a,i+1,last)
a = [2,8,4,6,99,8,82,12]
s = solution()
s.sort(a)
# 合併排序法
class solution:
def sort(self,a):
first = 0
last = len(a) - 1
# 和快速排序法一樣,需要將a的整體作為遞迴的變數
self.sort_begin(a,first,last)
return a
# 開始排序,需要注意先將a陣列按二分法進行分割
def sort_begin(self,a,first,last):
if first < last:
# 二分法分割陣列,劃分為最小的單元
mid = (first + last)/2
self.sort_begin(a,first,mid)
self.sort_begin(a,mid+1,last)
self.compare(a,first,last) # 從最底層(最小單元)到全部的排序,完成對a整體的排序
def compare(self,a,first,last):
if first < last:
mid = (first + last)/2
i = first
j = mid + 1
b =
# 將前一半和後一半進行比較,小的放在前面
while i <= mid and j <= last:
if a[i] < a[j]:
i = i +1
else:
j = j + 1
# 哪一半沒有遍歷完,將其加在排序後陣列的最後
while i<= mid:
i = i + 1
while j <= last:
j = j + 1
# 對遞迴變數a進行賦值
for i in range(len(b)):
a[first+i] = b[i]
s = solution()
s.sort([1,3,5,2,3,99,3,12,0,1])
分治法 合併排序
合併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用 分治法 divide and conquer 的乙個非常典型的應用。合併排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。將已有序的子串行...
分治法 合併排序
排序演算法是對一組數進行順序排序或者逆序排序,而合併排序就是排序演算法的一種。合併排序用到了分治策略實現對元素進行排序。合併排序的基本思想 把待排序的n個元素分解成n組,也就是每組乙個元素 之後對分好的組進行兩兩合併 無配對的則不操作 以此類推。以序列為例,排序過程如下 合併排序又叫做2 路歸併排序...
分治法合併排序(C )
參考 include include include using namespace std 合併函式 void merge int arr,int p,int q,int r for int j 0 j len2 j l len1 r len2 int max 定義無窮大 int i 0,j 0 ...