從序列中選擇乙個軸點元素(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 開始遍歷...