快排 堆排序

2021-10-02 03:42:03 字數 4115 閱讀 6094

荷蘭國旗問題

經典快排、改進快排、隨機快排

堆結構(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 不為...