桶排序(Bucket sort)箱排序,是一個排序算法,工作的原理是將數組分到幾個桶里,桶的數量可由排序數組最大值與最小值關系決定,可以固定幾個桶。每個桶內再通過插入、冒泡或簡單方式進行排序。其算法復雜度接近于:O(N)
步驟是:
1. 找到待排序中最大和最小的元素;
2. 得到桶的數量,比如最大減去最小再除以最小值;
3. 新建一個桶列表,然后遍歷數組,再將數組項除以桶的個數得到要存放的桶的下標,將數組項存入到對應桶中;
4. 存入到桶中時,按順序插入,保持順序;
5. 數據全部放入桶之后,再遍歷桶列表,將二維數組按順序展開取出即可。
output: [3, 3, 3.2, 4.3, 10, 15]
output: [-7, -2.1, 3, 3, 3.2, 4.3, 10, 15]
計數排序(Counting sort)、基數排序(radix sorting)和桶排序(Bucket Sort)是很類似的排序方式,都是非比較型的排序算法。
計數排序從最最小到最大值建立全部長度數組,然后挨個放里面放入,這對于數據范圍很大的數組,需要大量時間和內存,適用性不高。
基數排序是統一為同樣的數字長度,數字較短的數前面補零,也就是將數字拆分為個位十位百位。然后從最低位開始,依次進行一次排序?;鶖蹬判蚴蔷€性復雜度,即對n個數字處理了n次,代價較高。
桶排序將數組分到有限數量的桶子里,然后對每個桶子再分別進行排序,不需要過多的桶。對于大量數組,可以先采用桶排序分拆,再用其他排序算法來進行桶內排序。
選擇排序(Selection Sort)是從待排序數列中取出最小(或最大)的1位,與第一個位置交換,再從待排序數列中找出最小的跟整個數列的第二個交換。以此類推遍歷完待排序數列。平均算法復雜度:O(n^2)
步驟是:
例如數列: 4, 1, 3, 5, 2
從待排序區間中每次找到最小的項目,將其與第一項交換。
選擇排序過程
選擇排序的標準實現
選擇排序新建數組
程序員啟蒙排序算法 基礎中的基礎
思想:
var arr = [3, 4, 15,80,7, 2, 6, 5, 8, 9, 10, 16, 13]; // length = 13
function bubbleSort(arr){
//因為冒泡排序算法是兩兩比較 所以外層比較次數應為數組長度-1
for(var i = 0; i<arr.length - 1; i++){
// 內循環的比較不必全部執行完 因為每一輪的內循環都會將最大的數排在最右
// 所以后面的次數不用比較 所以內循環的次數是遞減的 需要減去一個i
for(var j = 0; j < arr.length -1 - i; j++){
if(arr[j] > arr[j+1]){
var t = arr[j];
arr[j] = arr[j+1];
arr[j+1] = t;
}
}
console.log(arr)
}
return arr;
}
console.log(bubbleSort(arr));
我自己是一名從事了多年開發的web前端老程序員,目前辭職在做自己的web前端私人定制課程,今年年初我花了一個月整理了一份最適合2019年學習的web前端學習干貨,各種框架都有整理,送給每一位前端小伙伴,想要獲取的可以關注我的頭條號并在后臺私信我:前端,即可免費獲取。
2. 插入排序
思想:
1.從第一個元素開始,該元素可以認為已經被排序;
2.取出當前元素的后一個元素,在已經排序的元素序列中從后向前循環一遍;
3.如果該元素(已排序的元素)大于新元素,將該元素移到下一位置;
4.重復步驟3,直到找到已排序的元素小于或者等于新元素的位置;
5.將新元素插入到該位置后;
6.重復步驟2~5。
var arr = [3, 4, 15, 80, 2, 7, 6, 5, 8, 9, 10, 16, 13]; // length = 13
function insertSort(arr) {
var current, preIndex;
var len = arr.length;
for (var i = 1; i < len; i++) {
//當前元素的前一個元素下標
preIndex = i - 1;
// 將需要排序的元素用current保存起來以免因下面下標變化而取錯值
current = arr[i];
// 開始內部循環將第一個值開始排序 終止條件為當前元素下標大于數組的第0位并且當前元素大于前一個元素 否則的話將前一個元素賦值給當前元素(arr[preIndex+1])
//然后將前一個元素下標-1 繼續向前比較
while (preIndex >= 0 && current < arr[preIndex]) {
arr[preIndex + 1] = arr[preIndex];
preIndex--;
}
// 當current大于前一個元素時 把保存起來的current賦值給arr[preIndex]
arr[preIndex + 1] = current;
}
return arr;
}
console.log(insertSort(arr));
思想:
var arr = [3, 4, 2, 6, 5, 8, 9, 10, 16, 13]; // length = 10
function quickSort(arr) {
if (arr.length <= 1) { return arr; }
// 基準值
var pivot = arr[Math.floor(arr.length / 2)];
arr.splice(arr.indexOf(pivot), 1);
var left = [];
var right = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quickSort(left).concat([pivot], quickSort(right));
}
console.log(quickSort(arr));
思想:
1.遍歷數組,設置最小值的索引為 0,
2.如果取出的值比當前最小值小,就替換最小值索引,遍歷完成后,將第一個元素和最小值索引上的值交換。
3.如上操作后,第一個元素就是數組中的最小值,下次遍歷就可以從索引 1 開始重復上述操作。
function selectionSort(arr) {
var len = arr.length;
var minIndex, temp;
for (var i = 0; i < len - 1; i++) {
minIndex = i;
for (var j = i + 1; j < len; j++) {
if (arr[j] < arr[minIndex]) { //尋找最小的數
minIndex = j; //將最小數的索引保存
}
}
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
return arr;
}
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(selectionSort(arr));
//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50];
原文鏈接:https://blog.csdn.net/weixin_42989966/article/details/103564643
作者:唐宋丶元明清
*請認真填寫需求信息,我們會在24小時內與您取得聯系。