快速排序也是一種採用分治策略的演算法,它與歸併排序不同的是,它是原址排序,不需要額外的空間。
如果把要排序的陣列簡單從任何位置切成兩個子陣列,對子陣列排序後,又因為是原址排序,排序後的兩個子陣列分別都是有序的,但是作為乙個整體很顯然未必就是是有序的呢
所以分解肯定就不能是簡單的把陣列切斷成兩個子陣列。而是首先找乙個陣列元素作為主元,然後找出比主元小的元素放到主元的坐邊,大的數放到右邊,然後對左邊的子陣列和右邊的子陣列排序,排好以後顯然整個陣列也是有序的,what a **** clever!
這個分解的步驟形式化的名詞就是劃分——partition
排序的偽**:
//接受乙個陣列,左下標,右下標,比只接受乙個陣列引數更靈活
quick-sort(a,p,r)
if p < r //這個條件不滿足,表示沒有元素要排序,函式什麼都不做
q = partition(a,p,r) //劃分陣列返回主元的下標
quick-sort(a,p,q-
1) quick-sort(a,q+
1,r)
else
return
接下來就是如何實現partition了
partition(a,p,r)
//選做好乙個元素做主元
x = a[r]
i = p - 1
for j=p to r-1
ifa[j] < x
i = i + 1
exchange a[i] with a[j]
//迴圈之後a[p..i]都小於x,a[i+1,..,r-1]都大於等於x
exchange a[i+1] with a[r]
//a[i+1]左邊的元素都小於自己,右邊的元素都大於自己
return i+1
演算法學習5
乙個最大堆 package com.example.demo.algorithm author aloli date 2020 9 10 13 35 乙個最大堆 public class maxheap public maxheap int size if size maxsize this siz...
排序演算法學習(5)
1.將2個各有n個元素的有序表歸併成乙個有序表,其最少的比較次數是 n 分析 歸併排序最少比較n,最多比較2n 1.當第乙個有序表中所有的元素都小於 或大於 第二個表中的元素,只需要用第二個表中的第乙個元素依次與第乙個表的元素比較,總計比較n次。分析二 a a0,a1,an b b0,b1,bn 為...
演算法學習Task5
k means演算法 聚類與分類的區別,分類的目標事先已知,而聚類是一種無監督學習,目標未知 具體方法有距離 密度 層次 網格 圖論 k means演算法基於距離 1 確定簇的個數k,可以通過經驗以及交叉檢驗可以 2 初始選取k個中心點,採用k means 加速收斂,即選擇樣本點中任意乙個作為第乙個...