伍六七帶你學演算法 高階篇 排序演算法

2021-10-04 14:11:47 字數 3371 閱讀 7798

給定乙個整數陣列 nums,將該陣列公升序排列。

示例 1:

輸入:[5,2,3,1]

輸出:[1,2,3,5]

示例 2:

輸入:[5,1,1,2,0,0]

輸出:[0,0,1,1,2,5]

各排序演算法解法如下: (如想要了解演算法排序原理,見》 十大演算法)

public

class

_912排序陣列

/** 快速排序

**/void

qsort

(int

arr,

int s,

int e)

arr[l]

= temp;

qsort

(arr,s,l)

;qsort

(arr,l +

1, e);}

}/**

選擇排序

**/void

selectsort

(int

arr)}if

(min != i)}}

/** *

* 插入排序:數列前面部分看為有序,依次將後面的無序數列元素插入到前面的有序數列中,初始狀態有序數列僅有乙個元素,即首元素。在將無序數列元素插入有序數列的過程中,採用了逆序遍歷有序數列,相較於順序遍歷會稍顯繁瑣,但當數列本身已近排序狀態效率會更高。

** 時間複雜度:o(n2)   穩定性:穩定

* @param arr

*/public

void

insertsort

(int arr)

else}}

}/**

* 希爾排序 - 插入排序的改進版。為了減少資料的移動次數,在初始序列較大時取較大的步長,通常取序列長度的一半,此時只有兩個元素比較,交換一次;之後步長依次減半直至步長為1,即為插入排序,由於此時序列已接近有序,故插入元素時資料移動的次數會相對較少,效率得到了提高。

** 時間複雜度:通常認為是o(n3/2) ,未驗證  穩定性:不穩定

* @param arr

*/void

shellsort

(int arr)

else

break;}

} d >>=1;

}}/** * 桶排序 - 實現線性排序,但當元素間值得大小有較大差距時會帶來記憶體空間的較大浪費。首先,找出待排序列中得最大元素max,申請記憶體大小為max + 1的桶(陣列)並初始化為0;然後,遍歷排序數列,並依次將每個元素作為下標的桶元素值自增1;

* 最後,遍歷桶元素,並依次將值非0的元素下標值載入排序數列(桶元素》1表明有值大小相等的元素,此時依次將他們載入排序數列),遍歷完成,排序數列便為有序數列。

** 時間複雜度:o(x*n)   穩定性:穩定

* @param arr

*/void

bucketsort

(int

arr)

int ar =0;

for(

int i =

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

}/**

* 基數排序 - 桶排序的改進版,桶的大小固定為10,減少了記憶體空間的開銷。首先,找出待排序列中得最大元素max,並依次按max的低位到高位對所有元素排序;

* 桶元素10個元素的大小即為待排序數列元素對應數值為相等元素的個數,即每次遍歷待排序數列,桶將其按對應數值位大小分為了10個層級,桶內元素值得和為待排序數列元素個數。

* @param arr

*/void

countsort

(int

arr)

if(max <

0) max =

-max;

max = max.

tostring()

.length()

;int

bd =

newint[19

][arr.length]

;for

(int k =

0; k < max; k++

)int fl =0;

for(

int l =

0; l <

19; l++)}

} bk =

newint[19

];fl =0;

}}/** * 歸併排序 - 採用了分治和遞迴的思想,遞迴&分治-排序整個數列如同排序兩個有序數列,依次執行這個過程直至排序末端的兩個元素,再依次向上層輸送排序好的兩個子列進行排序直至整個數列有序(模擬二叉樹的思想,from down to up)。

** 時間複雜度:o(nlogn)   穩定性:穩定

* @param arr

*/void

mergesortinorder

(int

arr,

int bgn,

int mid,

int end)

else

}while

(l <= mid)

while

(m <= e)

for(

int i =

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

void

mergesort

(int

arr,

int bgn,

int end)

int mid =

(bgn + end)

>>1;

mergesort

(arr,bgn,mid)

;mergesort

(arr,mid +

1, end)

;mergesortinorder

(arr,bgn,mid,end);}

/** * 堆排序 - 堆排序的思想借助於二叉堆中的最大堆得以實現。首先,將待排序數列抽象為二叉樹,並構造出最大堆;然後,依次將最大元素(即根節點元素)與待排序數列的最後乙個元素交換(即二叉樹最深層最右邊的葉子結點元素);

* 每次遍歷,重新整理最後乙個元素的位置(自減1),直至其與首元素相交,即完成排序。

** 時間複雜度:o(nlogn)   穩定性:不穩定

** @param arr

*/void

heapsort

(int

nums)

for(

int i = size -

1; i >=

1; i--)}

void

adjust

(int

nums,

int len,

int index)

}}

以上!

伍六七帶你學演算法 入門篇 拼寫單詞

力扣解題,每日一題 1160.拼寫單詞 難度 簡單 給你乙份 詞彙表 字串陣列 words 和一張 字母表 字串 chars。假如你可以用 chars 中的 字母 字元 拼寫出 words 中的某個 單詞 字串 那麼我們就認為你掌握了這個單詞。注意 每次拼寫時,chars 中的每個字母都只能用一次。...

伍六七帶你學演算法 入門篇 最長回文串

力扣解題,每日一題 409.最長回文串 難度 簡單 給定乙個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的回文串。在構造過程中,請注意區分大小寫。比如 aa 不能當做乙個回文字串。注意 假設字串的長度不會超過 1010。示例 1 輸入 abccccdd 輸出 7 解釋 我們可以構造的最...

伍六七帶你學演算法 入門篇 鍊錶的中間節點

力扣 876鍊錶的中間節點 難度 簡單 給定乙個帶有頭結點 head 的非空單鏈表,返回鍊錶的中間結點。如果有兩個中間結點,則返回第二個中間結點。示例 1 輸入 1,2,3,4,5 輸出 此列表中的結點 3 序列化形式 3,4,5 返回的結點值為 3 測評系統對該結點序列化表述是 3,4,5 注意,...