演算法初實踐(殘缺的快速排序)

2021-08-25 11:09:46 字數 1862 閱讀 8265

import random

import time

def quick_sort(array, l, r):

if l > r:

return

i, j = l, r#使用i,j臨時儲存左右的下標

temp = array[l]

while i != j:#如果左邊不等於右邊,進行迴圈遍歷

while array[j] >= temp and i < j:#如果右邊的數大於等於基數且i小於j,當碰到小於基數的數時停止

j -= 1#右下標向左前進一位

#print('r:{}'.format(array))

while array[i] <= temp and i < j:#如果左邊的數小於等於基數且i小於j,當碰到大於基數的數時停止

i += 1#左下標向右前進一位

#print('l:{}'.format(array))

if i < j:#如果i小於j,說明右邊有小於基數的數,左邊有大於基數的數,將倆數交換位置,然後重複上述的操作,直到i==j

a[l], a[r] = a[r], a[l]

#一輪結束,將基數與i與j相遇的值交換

a[l] = a[i]

a[i] = temp

quick_sort(array, l, i-1);#繼續處理左邊的,這裡是乙個遞迴的過程 

quick_sort(array, i+1, r);#繼續處理右邊的 ,這裡是乙個遞迴的過程

if __name__ == '__main__':#時間複雜度o(nlogn),本**有問題,數值太多就會超過最大遞迴深度

print(time.asctime(time.localtime(time.time())))

a = create_array()    

#a = [10, 5, 9]

print(a)

quick_sort(a, 0, len(a)-1)

print(a)

print(time.asctime(time.localtime(time.time())))

以下是演算法導論中的快排,剛開始學python,學起來還是有點困難,哈哈

import random

import time

def quick_sort(array, l, r):

if l < r:

q = partition(array, l, r)

quick_sort(array, l, q - 1)

quick_sort(array, q + 1, r)

def partition(array, l, r):#100萬隨機數需要9秒

x = array[r]#將最右邊的數作為基數

i = l - 1

for j in range(l, r):#讓倆個數,從l向r-1依次遞增

if array[j] <= x:#如果當前值小於等於基數

i += 1

array[i], array[j] = array[j], array[i]#

array[i + 1], array[r] = array[r], array[i+1]

return i + 1

if __name__ == '__main__':#時間複雜度o(n平方)

print(time.asctime(time.localtime(time.time())))

a = create_array()    

print(a)

quick_sort(a, 0, len(a)-1)

print(a)

print(time.asctime(time.localtime(time.time())))

好了,掰掰~~

java演算法實踐之快速排序

快速排序是乙個知名度極高的排序演算法,其對於大資料的優秀排序效能和相同複雜度演算法中相對簡單的實現使它注定得到比其他演算法更多的寵愛。演算法概述 思路 快速排序一般基於遞迴實現。其思路是這樣的 1.選定乙個合適的值 理想情況中值最好,但實現中一般使用陣列第乙個值 稱為 樞軸 pivot 2.基於這個...

初遇資料結構 快速排序演算法

在資料結構裡快速排序演算法相比直接選擇排序,插入排序可以算是比較高效的演算法,是在1962年被提出來的,並不斷完善發展直到今天有三個方法的快速排序分別是 對於第一種方法是選擇乙個標準值 一般選擇第乙個數字或者最後乙個數字 設定兩個標記left和right left從左到右找到比標準值大和相等的,ri...

AJPFX實踐 java實現快速排序演算法

快速排序演算法使用的分治法策略來把乙個序列分為兩個子串行來實現排序的 思路 1.從數列中挑出乙個元素,稱為 基準 2.重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分割之後,該基準是它的最後位置。這個稱為分操作 3.遞迴地把小於基準...