快速排序,⼜稱劃分交換排序
1.通過⼀趟排序將要排序的資料分割成獨⽴的兩部分,
其中⼀部分的所有資料都⽐另外⼀部分的所有資料都要⼩
2.然後再按此⽅法對這兩部分資料分別進⾏快速排序,整個排序過程可以遞迴進⾏,以此達到整個資料變成有序序列。
步驟為:
從數列中挑出⼀個元素,稱為"基準"(pivot)
重新排序數列,所有元素⽐基準值⼩的擺放在基準前⾯,所有元素⽐基準值⼤的擺在基準的後⾯(相同的數可以到任⼀邊)。
在這個分割槽結束之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。
遞迴地(recursive)把⼩於基準值元素的⼦數列和⼤於基準值元素的⼦
數列排序。
遞迴的最底部情形,是數列的⼤⼩是零或⼀,也就是永遠都已經被排序好了。雖然⼀直遞迴下去,但是這個演算法總會結束,因為在每次的迭代(iteration)中,它⾄少會把⼀個元素擺到它最後的位置去。
# 完成一輪排序過程
def sub_sort
(list_,low,high)
: # 基準數
x = list_[low]
while low < high:
# 後面的數小於x放到前面的空位
while list_[high]
>= x and high > low:
high -=
1 list_[low]
= list_[high] # 將數往前甩
while list_[low]
< x and low < high:
low +=
1 list_[high]
= list_[low]
list_[low]
= x # 將基準數插入
return low
# 快排 low 第乙個數序列號 high 最後乙個數序列號
def quick
(list_,low,high)
:if low < high:
key =
sub_sort
(list_,low,high)
quick
(list_,low,key -1)
quick
(list_, key+
1, high)
#快速排序 方法一
quicker =[7
,12,29
,31,6
,3]quick
(quicker,0,
5)print
(quicker)
def quicksort
(data,start,end)
: i = start
j =end
if i>=j:
return
flag =data[start]
while iwhile i>=flag:
j-=1 temp=data[j]
data[i]
=data[j]
while i<=flag:
i+=1 data[j]
=data[i]
data[i]
=flag
quicksort
(data,start,i-1)
quicksort
(data,i+
1,end)
#方法二的快速排序
data =[45
,3,2
,6,78
,5,33
,22,65
,46]quicksort
(data,0,
len(data)-1
)print
(data)
其實兩種方法的快速排序是一樣的,快速排序的程式挺不好理解的。不常用總忘,筆試面試還考。
這裡引用其他人的程式,我有加了我的方法。以此銘記
python快速排序 兩種方法
快速排序,稱劃分交換排序 1.通過 趟排序將要排序的資料分割成獨 的兩部分,其中 部分的所有資料都 另外 部分的所有資料都要 2.然後再按此 法對這兩部分資料分別進 快速排序,整個排序過程可以遞迴進 以此達到整個資料變成有序序列。步驟為 從數列中挑出 個元素,稱為 基準 pivot 重新排序數列,所...
排序的兩種方法
如果adt需要比較大小,或者要放入collections或arrays進行排序,可實現comparator介面並override compare 函式。第一種 構建乙個新的comparator類,重寫compare 函式,在客戶端直接呼叫靜態函式collections.sort 新的comparat...
List排序的兩種方法
方法一 先定義乙個類,並繼承iconparable介面,在類裡面對compareto方法進行重寫。public class sort test icomparable public string name public int compareto object obj else if this.id...