資料結構與演算法 排序演算法 (堆排 快排 歸併)

2021-09-11 05:19:56 字數 3401 閱讀 4794

快排的時間複雜度是o(nlogn)

其實現思想就是隨機找到乙個中間值 小於這個值得放左邊 大於這個值得放右邊

然後大於這個值得半部分和小於這個值得半部分分別遞迴

直到全部排完

jdk1.8中的arrays.sort()的排序方法就是使用的快排 當資料量大於47的時候採用快排

小於47的時候使用插排

實現**:

public

class

quicksort

}/**

* 劃分陣列的partition過程 時間複雜度為o(n) 返回的為等於區域的左右邊界

* @param arr

* @param left

* @param right

* @return

*/private

static

int[

]partition

(int

arr,

int left,

int right)

else

if(arr[left]

> arr[right]

)else

}swap

(arr,more,right)

;return

newint

;}private

static

void

swap

(int

arr,

int j,

int i)

public

static

void

main

(string[

] args)

}

堆排就是建立乙個抽象意義上的堆、演算法上的堆是乙個完全二叉樹結構。

其底層是乙個陣列,乙個節點的左孩子是 index * 2 + 1

右孩子是 index * 2 + 2

父親節點是 (index - 1)/ 2

大根堆就是在以當前節點作為乙個樹的時候、此節點是整棵樹中的最大值(小根堆反之)。

堆排序主要分為兩步:

1、建立乙個堆,然後每次將堆頂的元素和最後一層的最後乙個元素交換。

2、然後將堆頂的元素進行下沉,直到以他為樹的所有節點中只有他最大(小)。

堆排時間複雜度是嚴格意義上的o(nlogn) 空間複雜度是o(1)

堆排的應用如優先順序佇列等。

public

class

heapsort

//建立大根堆 每個節點是整個子樹中的最大值

for(

int i =

0; i < arr.length ; i++

)int size = arr.length;

swap

(arr,0,

--size)

;while

(size >0)

}/**

* 下沉的過程

* @param arr

* @param index

* @param size

*/private

static

void

heapify

(int

arr,

int index,

int size)

swap

(arr,largest,index)

; index = largest;

left = index *2+

1;}}

/** * 從index位置開始進行與父節點的比較 直到不比父節點大 或者到0的位置停止

* @param arr

* @param index

*/private

static

void

heapinsert

(int

arr,

int index)

}private

static

void

swap

(int

arr,

int j,

int i)

public

static

void

main

(string[

] args)

}

歸併排序就是將陣列遞迴的兩兩劃分、然後再合併的過程 在合併的過程中排好序

遞的過程就是將陣列從中間分成兩半、直到陣列大小為1,

歸的過程就是講兩部分合成成乙個部分,合成的過程中排好序

時間複雜度o(nlogn)

public

class

mergesort

mergesort

(arr,

0, arr.length -1)

;}private

static

void

mergesort

(int

arr,

int left,

int right)

//left 和right的中間位置

int mid = left +

((right - left)

>>>1)

;//左半部分遞迴

mergesort

(arr, left, mid)

;//右半部分遞迴

mergesort

(arr, mid +

1, right)

;//最後再合併

merge

(arr, left, mid, right);}

/** * 合併 l 到 r上以 mid 為劃分點的兩部分的元素

** @param arr

* @param left

* @param mid

* @param right

*/private

static

void

merge

(int

arr,

int left,

int mid,

int right)

while

(leftpoint <= mid)

while

(rightpoint <= right)

//將陣列拷貝回原陣列

for(i =

0; i < help.length; i++)}

public

static

void

main

(string[

] args)

}

2011 4 15 快排演算法,堆排演算法

template int get pivot index value type array,int start,int end value type pivot array start while start end while startpivot end array start array en...

Python 資料結構與演算法 快排

1.先從待排序的陣列中找出乙個數作為基準數 取第乙個數即可 然後將原來的陣列劃分成兩部分 小於基準數的左子陣列和大於等於基準數的右子陣列。然後對這兩個子陣列再遞迴重複上述過程,直到兩個子陣列的所有數都分別有序。最後返回 左子陣列 基準數 右子陣列 即是最終排序好的陣列。def quicksort n...

資料結構與演算法 排序(歸併和快排)

快速排序原理 歸併排序和快速排序的區別 歸併排序的核心思想還是蠻簡單的。如果要排序乙個陣列,我們先把陣列從中間分成前後兩部分,然後對前後兩部分分別排序,再將排好序的兩部分合併在一起,這樣整個陣列就都有序了。歸併排序使用的就是分治思想。分治,顧名思義,就是分而治之,將乙個大問題分解成小的子問題來解決。...