演算法 排序 02

2021-10-10 04:18:51 字數 4284 閱讀 7545

從序列中選擇乙個軸點元素(pivot)

假設每次選擇 0 位置的元素為軸點元素

利用 pivot 將序列分割成 2 個子序列

1. 將小於 pivot 的元素放在pivot前面(左側)

2. 將大於 pivot 的元素放在pivot後面(右側)

3. 等於pivot的元素放哪邊都可以

對子序列進行上述操作, 直到不能再分割(子串行中只剩下1個元素)

# 極限情況 : 軸點構造後, 軸點兩邊極度不均衡, 例 : [0] [pivot] [length - 1]

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-t83tcknj-1604243291801)(…/img/快速排序.png)]

/**

* 門面方法

*/public

static integer[

]quicksort

(integer[

] array)

/** * 核心方法

*/public

static integer[

]quicksort

(integer[

] array,

int begin,

int end)

integer[

] sortarray = array;

// 軸點構造, 並獲取下次軸點構造的引數, mid 為軸點的現在位置下標

int mid =

pivotindex

(array, begin, end)

;// 左右部分快速排序

quicksort

(array, begin, mid)

;quicksort

(array, mid +

1, end)

;return array;

}/**

* 對 array[begin, end) 進行軸點構造

*/private

static

intpivotindex

(integer[

] array,

int begin,

int end)

else

}// array[begin] 的交換

while

(begin < end)

else}}

// value 重新進入陣列

array[begin]

= value;

return begin;

}

# 希爾排序 / 遞減增量排序 (diminishing increment sort)

把序列看作是乙個矩陣,分成 ? 列,逐列進行排序, m 從某個整數逐漸減為 1 , 當 ? 為 1 時,整個序列將完全有序

# 底層排序

不難看出來, 逆序對的數量在逐漸減少

因此希爾排序底層一般使用插入排序對每一列進行排序,也很多資料認為希爾排序是插入排序的改進版

* 門面

*/public

static integer[

]shellsort

(integer[

] array)

return sortarray;

}/**

* 核心方法, 底層是插入排序, 但是修改插入步數

*/private

static integer[

]shellsort

(integer[

] array,

int step)

// 正式插入

array[flag]

= value;

}return array;

}/**

* 獲取步數集合 steps : , 上乙個元素除二

*/private

static arraylist

step

(integer[

] array)

return steps;

}

# 計數排序、桶排序、基數排序,都不是基於比較的排序

它們是典型的用空間換時間,在某些時候,平均時間複雜度可以比 o(nlogn) 更低

# 原理 :

統計每個整數在序列**現的次數,進而推導出每個整數在有序序列中的索引

// 獲取陣列最大值最小值

private

static integer[

]getmaxandmin

(integer[

] array)

;for

(int i =

1; i < array.length; i++)if

(array[i]

< maxandmin[1]

)}return maxandmin;

}/**

* 計算 count 陣列

*/private

static

int[

]count

(integer[

] array)

// count 陣列存放未來排好序陣列的下標

for(

int i =

1; i < count.length; i++

)return count;

}/**

* 核心

*/public

static integer[

]countsort

(integer[

] array)

return sortarray;

}

基數排序非常適合用於整數排序 (尤其是非負整數)

# 執行流程:

依次對個位數、十位數、百位數、千位數、萬位數...進行排序 (從低位到高位)

public

static integer[

]radixsort

(integer[

] array)

return array;

}private

static integer[

]radixsort

(integer[

] array,

int divider)

for(

int i =

1; i < count.length; i++

)for

(int i = array.length -

1; i >=

0; i--

)return sortarray;

}

# 執行流程

1. 建立一定數量的桶(比如用陣列、鍊錶作為桶)

2. 按照一定的規則(不同型別的資料,規則不同),將序列中的元素均勻分配到對應的桶

3. 分別對每個桶進行單獨排序

4. 將所有非空桶的元素合併成有序序列

# 沒有答案, 按照不同情況會有不同結果

public

static integer[

]bucketsort

(integer[

] array)

bucket.

add(array[i]);

}// 桶排序, 並且將桶中元素放入陣列中

int flag =0;

for(

int i =

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

return sortarray;

}

nue;

// 桶內排序

integer sort = buckets[i].toarray(new integer[buckets[i].size()]);

sort = insertsort(sort);

// 放入

for (int j = 0; j < sort.length; j++)

}return sortarray;

}

排序演算法02 選擇排序

首先,從 0,len 中找到陣列中最小的元素,讓它與第乙個元素交換。接著從 1,len 中找出最小的元素,讓它與第二個元素交換。迴圈往復,最終使得陣列從小到大排序。視覺化效果 這裡 created by yiying on 2017 4 22.function w 選擇排序演算法實現 selecti...

排序演算法 02氣泡排序

氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢 浮 到數列的頂端。比較相鄰的元素。如果第乙個比第二個大,就交...

演算法 02 插入排序

插入排序 insertsort 如撲克牌插牌一樣,通過構建有序序列,將元素插入乙個已經排序好的序列中。插入排序是對氣泡排序的改進。插入排序同樣通過構建巢狀for的形式進行排序。for i 1 i i for j i 1 j 0 j 將a 0 看成是已經排好序的序列,所以從第2個元素 i 1 開始遍歷...