演算法(15) 各種常用的排序演算法

2021-10-21 18:18:00 字數 3511 閱讀 7545

僅記錄學習筆記,如有錯誤歡迎指正。

記錄一下常用的陣列的各種排序 複雜度o(n2)

public static

void

bubblesort

(int

array)

int length = array.length;

// 外層迴圈控制比較輪數i

for(

int i =

0; i < length; i++)}

}

複雜度o(n2)
public static

void

selectionsort

(int

array)

int length = array.length;

for(

int i =

0;i1;i++)}

// 交換元素位置

if(i != minindex)}}

//交換位置的方法

private static

void

swap

(int

array,

int a,

int b)

複雜度o(n2)
public static

void

insertionsort

(int

array)

int length = array.length;

int flagnum;

//這是每次需要插入的數

for(

int i =

1;i1;i++

) array[j+1]

=flagnum;

}}

複雜度o(nlog2n)
public static

void

shellsort

(int

array)

int length = array.length;

// temp為臨時變數,gap增量預設是長度的一半,每次變為之前的一半,直到最終陣列有序

int temp, gap = length /2;

while

(gap >0)

// 將當前數放到空出來的位置

array[preindex + gap]

= temp;

} gap /=2

;}}

分治法 t(n) = o(nlogn)
public static

void

mergesort

(int

array)

sort

(array,

0, array.length -1)

;}private static

void

sort

(int

array,

int left,

int right)

int mid = left +

((right - left)

>>1)

;// 對左側子串行進行遞迴排序

sort

(array, left, mid)

;// 對右側子串行進行遞迴排序

sort

(array, mid +

1, right)

;// 合併

merge

(array, left, mid, right);}

private static

void

merge

(int

array,

int left,

int mid,

int right)

// 上面的迴圈退出後,把剩餘的元素依次填入到temp中

// 以下兩個while只有乙個會執行

while

(p1 <= mid)

while

(p2 <= right)

// 把最終的排序的結果複製給原陣列

for(i =

0; i < temp.length; i++

)}

o(nlogn) 多來看看!~
public static

void

quicksort

(int

array)

//過載方便呼叫

private static

void

quicksort

(int

array,

int left,

int right)

int mid =

partition

(array,left,right)

;quicksort

(array, left, mid)

;//第一次結束後對左邊進行排序

quicksort

(array, mid +

1, right)

;//第一次結束後對右邊邊進行排序

} private static

intpartition

(int

array,

int left,

int right)

//找到後直接賦值

if(left < right)

while

(array[left]

<= temp && left < right)

if(left < right)

} array[left]

= temp;

//基準數的值賦值回來

return left;

}

大根堆 根節點的值大於左節點的值小於右節點的值
public static

void

heapsort

(int

array)

int length = array.length;

//1.構建大頂堆

for(

int i = length /2-

1; i >=

0; i--

)//2.調整堆結構+交換堆頂元素與末尾元素

for(

int j = length -

1; j >

0; j--)}

private static

void

adjustheap

(int

array,

int i,

int length)

//如果子節點大於父節點,將子節點值賦給父節點(不用進行交換)

if(array[k]

> temp)

else

}//將temp值放到最終的位置

array[i]

= temp;

}

還有一些不太常用的就沒記錄了,想看的可以去下面位址。

排序1 5 各種排序演算法的總結和比較

嚴重宣告 此貼 http www.cnblogs.com flyingbread archive 2007 02 02 636993.html,請註明出處。1 快速排序 quicksort 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來說,它是歸併排序的就地版本。快速排序可以由下面...

排序1 5 各種排序演算法的總結和比較

1 快速排序 quicksort 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來說,它是歸併排序的就地版本。快速排序可以由下面四步組成。1 如果不多於1個資料,直接返回。2 一般選擇序列最左邊的值作為支點資料。3 將序列分成2部分,一部分都大於支點資料,另外一部分都小於支點資料。4...

js實現各種常用排序演算法

氣泡排序 var bubblesort function arr if flag 2.選擇排序var selectsort function arr if i min console.log i 1 arr function swap arr,index1,index2 3.插入排序var inse...