快速排序法和合併排序法 Python實現

2021-08-21 15:54:20 字數 1913 閱讀 2102

# 快速排序法

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 ...