荷蘭國旗問題
經典快排、改進快排、隨機快排
堆結構(from左神演算法初級班第二節)
問題一:
給定乙個陣列arr,和乙個數num,請把小於等於num的數放在數 組的左邊,大於num的數放在陣列的右邊。
要求額外空間複雜度o(1),時間複雜度o(n)
問題二(荷蘭國旗問題) 給定乙個陣列arr,和乙個數num,請把小於num的數放在陣列的 左邊,等於num的數放在陣列的中間,大於num的數放在陣列的 右邊。
要求額外空間複雜度o(1),時間複雜度o(n)
荷蘭國旗問題**:
public
static
int[
]partition
(int
arr,
int l,
int r,
int p)
else
if(arr[l]
> p)
else
}return
newint
;}// for test
public
static
void
swap
(int
arr,
int i,
int j)
優點:常數項很低、常數項操作很少
時間複雜度o(n*logn)
額外空間複雜度o(logn)(需要記錄劃分點,也就是樹結構)
資料狀況糟糕的話,時間複雜度會變成o(n2)
1)原理:以最後乙個數x為界,小於x放左邊,大於放x右邊。x左邊再以最後乙個數y為界,小於y放在y左邊,大於y放在y右邊,一直遞迴下去。
2)**:
public
static
void
quicksort
(int
arr)
quicksort
(arr,
0, arr.length -1)
;}public
static
void
quicksort
(int
arr,
int l,
int r)
}public
static
int[
]partition
(int
arr,
int l,
int r)
else
if(arr[l]
> arr[r]
)else
}swap
(arr, more, r)
;return
newint
;}public
static
void
swap
(int
arr,
int i,
int j)
3)隨機快排
隨機在陣列上選乙個數,然後和最後乙個數交換,再進行快排。
長期期望時間複雜度為:o(n*logn)
swap
(arr, l +
(int
)(math.
random()
*(r - l +1)
), r)
;//加一行就是隨機快排
1)什麼是完全二叉樹?
任何乙個非葉子節點是完全二叉樹
二叉樹求下標關係:
二叉樹下標
父節點樹下標
(i-1)/2
左孩子樹下標
2*i+1
右孩子樹下標
2*i+2
例如:該陣列找到其父節點和左右孩子樹
其樹結構為:
2)大根堆、小根堆
大根堆:樹的最大值在頭結點(整棵樹)
小根堆:樹的最小值在頭結點(整棵樹)
建立大根堆:
public
static
void
heapinsert
(int
arr,
int index)
}
建立大根堆的時間複雜度為:o(logn),因為是完全二叉樹形成的高度
3)堆上最大值發生變化,需要調整大根堆時:
public
static
void
heapify
(int
arr,
int index,
int size)
swap
(arr, largest, index)
; index = largest;
left = index *2+
1;}}
4)堆結構完整**:
public
static
void
heapsort
(int
arr)
for(
int i =
0; i < arr.length; i++)}
public
static
void
heapinsert
(int
arr,
int index)
}public
static
void
heapify
(int
arr,
int index,
int size)
swap
(arr, largest, index)
;//largest!=index
index = largest;
left = index *2+
1;}}
public
static
void
swap
(int
arr,
int i,
int j)
5)用堆結構求中位數問題(時間複雜度為:o(logn)):
**:
public
static
void
heapsort
(int
arr)
for(
int i =
0; i < arr.length; i++
)int size = arr.length;
swap
(arr,0,
--size)
;while
(size >0)
}public
static
void
heapinsert
(int
arr,
int index)
}public
static
void
heapify
(int
arr,
int index,
int size)
swap
(arr, largest, index)
;//largest!=index
index = largest;
left = index *2+
1;}}
public
static
void
swap
(int
arr,
int i,
int j)
快排 堆排序
快速排序主要運用了二分的思想,每次選擇乙個基準元素,比基準元素打的元素都放在基準元素前面,比基準元素小的元素都放在基準元素後面,這樣不斷遞迴細分,完成排序。void quicksort int a,int l,int r if ia i a j i while ia i temp if ia j a...
排序介紹(選擇 冒泡 快排 堆排序)
問題描述 排序問題 給出一組數字,要求按照數值的大小進行排序 例如 這組資料進行公升序的排列後的順序為 氣泡排序 是一種簡單的排序演算法,它實現的過程 不斷重複的走訪過要排列的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來,走訪數列的工作就是重複的進行,直到沒有再需要進行交換的的時候,就...
排序專題(桶排序,冒泡,快排,堆排序)
1.最簡單的排序 桶排序 簡化版 優點 快速,簡單 缺點 資料足夠大時,會造成嚴重的空間浪費 不能解決小數問題 理解 桶排序就是開乙個足夠大的陣列,陣列下標最大值 設為x,a x 要大於需要排序的資料最大值。設輸入為ni,則只要令a ni 就可以確定相同ni的個數,然後從從0到n,只要a ni 不為...