演算法學習 排序演算法

2021-10-04 21:53:03 字數 4592 閱讀 3761

排序演算法

平均時間複雜度

最好情況

最壞情況

空間複雜度

穩定性氣泡排序

o(n^2)

o(n)

o(n^2)

o(1)

穩定選擇排序

o(n^2)

o(n^2)

o(n^2)

o(1)

不穩定插入排序

o(n^2)

o(n)

o(n^2)

o(1)

穩定希爾排序

o(nlogn)

o(nlogn)

o(nlogn)

o(1)

不穩定快速排序

o(nlogn)

o(nlogn)

o(n^2)

o(logn)

不穩定歸併排序

o(nlogn)

o(nlogn)

o(nlogn)

o(n)

穩定堆排序

o(nlogn)

o(nlogn)

o(nlogn)

o(1)

不穩定基數排序

o(n*k)

o(n*k)

o(n*k)

o(n+k)

穩定計數排序

o(n+k)

o(n+k)

o(n+k)

o(k)

穩定桶排序

o(n+k)

o(n+k)

o(n^2)

o(n+k)穩定

冒泡的效率太低,每一輪將當前最大的放到後面,主要掌握陣列中元素的交換

選擇排序的效率較低,但經常用它的內部迴圈方式來尋找最大/最小值

插入排序的平均效率低,但當序列基本有序時,插入排序很快,在jdk的arrays.sort()方法中,當數量較小時,會採用插入排序

希爾排序是對插入排序的一種改良

快速排序是軟體工業中最常見的排序演算法,用於求topk的問題

歸併排序,空間換時間的方法,可以用來求逆序對

堆排序,使用大頂堆,適用於海量資料的排序(1-7都是基於比較的排序,最好情況是o(nlogn))

計數排序,可以說是最快的(o(n+k)),若陣列中的數字比較稀疏的時候,會造成大量的空間浪費

桶排序,先分桶,將資料分為幾塊,再對每乙個桶用其他方式排序,最終得到全部排序,要求資料是均勻分布,如果資料全部集中在乙個桶,就會導致時間複雜度還是o(nlogn)

基數排序是整數數值型排序裡面又穩又快的,開闢固定的空間

public

static

void

bubblesort

(int

arr)}if

(!flag)

}}

public

static

void

selectsort

(int

arr)}if

(minindex != i)

}}

public

static

void

insertsort

(int

arr)

//這裡是j+1

arr[j+1]

= num;

}}

//交換法

public

static

void

shellsort

(int

arr)}}

}}//插入法

public

static

void

shellsort2

(int

arr)

arr[j]

= temp;}}

}}

public

static

void

quicksort

(int

arr)

private

static

void

quicksort

(int left,

int right,

int[

] arr)

while

(arr[l]

< pivot)

if(l >= r)

break

;//交換arr[l]和arr[r]

arr[l]

= arr[r]

^ arr[l]

; arr[r]

= arr[r]

^ arr[l]

; arr[l]

= arr[r]

^ arr[l];if

(arr[l]

== pivot) r--;if

(arr[r]

== pivot) l++;}

if(l == r)

if(left < r)

quicksort

(left, r, arr);if

(right > l)

quicksort

(l, right, arr)

;}

public

static

void

mergesort

(int

arr)

private

static

void

mergesort

(int

arr,

int left,

int right,

int[

] temp)

}private

static

void

merge

(int

arr,

int left,

int mid,

int right,

int[

] temp)

while

(i <= mid)

while

(j <= right)

t =0;

while

(left <= right)

}

public

static

void

radixsort

(int

arr)

}int maxlength =

(max +"")

.length()

;for

(int i =

0, n =

1; i < maxlength; i++

, n *=10)

//按照桶的順序依次取出桶中的元素

int index =0;

for(

int k =

0; k < bucket.length ; k++)}

//每一輪結束後,需要清空bucketelementcounts

bucketelementcounts[k]=0

;}system.out.

println

("第"

+(i+1)

+"輪後:"

+arrays.

tostring

(arr));

}}

public

static

void

heapsort

(int

arr)

for(

int j = arr.length-

1; j >

0; j--

) system.out.

println

(arrays.

tostring

(arr));

}/** @description 完成將以i對應的非葉子節點的樹調整成大頂堆

* @param arr 待調整的陣列

* @param i 非葉子節點在陣列中的索引

* @param length 調整的元素的個數,在逐漸減少

* @return void 將二叉樹陣列調整成大頂堆

**/private

static

void

makeheap

(int

arr,

int i,

int length)

if(arr[k]

> temp)

else

}//for迴圈結束後,已經將以i為父節點的樹的最大值放在了i的位置

//將temp的值指向調整過後的位置

arr[i]

= temp;

}

public

static

void

countsort

(int

arr)

for(

int i =

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

}}

排序演算法學習

一直都想把排序和搜尋類的演算法總結一下,一直拖著沒寫,主要是太懶了,現在決定還是要再好好學習下這些基本的演算法。畢竟基礎真的是很重要。好了現在開始學習第乙個排序演算法 插入排序 我記得插入排序在我們以前的資料結構教程上是第乙個介紹的 插入排序 聽這個排序名字就是將乙個什麼數要插入到某個地方,不錯,他...

排序演算法學習

1.氣泡排序 using system using system.collections.generic using system.linq using system.text using system.threading.tasks namespace 排序演算法練習 從小排序 public ov...

排序演算法學習

快速排序演算法 通過一趟排序將資料分成兩部分 其中一部分的資料要比 另外一部分小或大 利用遞迴進行 直至資料有序 演算法步驟 1.定義兩個指標分別指向低位和高位 2.將陣列第乙個元素作為基數 3.從後往前遍歷 high 直至找到第乙個小於key的值 4.從前往後遍歷 low 直至找到第乙個大於key...