六種思路:(純自己實現,有bug歡迎提醒)圖解排序算法
-
狗熊掰玉米法(冒泡法)
需求是幾根玉米從短到長排列。
狗熊先拿起第一個放在手中,去跟第二個比,如果大于第二個,就比較第三個,否則就放下第一個,拿起第二個,直到比較了所有,這是,手中的肯定是最大的,并把它放在最后。以此類推。
//冒泡函數:
function bubble(arr){
for (let n=0; n< arr.length-1; n++){
for(let m=0; m<arr.length-n-1;m++){
if(arr[m]>arr[m+1]){
conversion(arr,m,m+1)
}
}
}
return arr;
}
//交換函數:
function swap(array,po1,po2){
let po = array[po1];
array[po1] = array[po2];
array[po2] = po;
}
-
教官排位置法(選擇排序法)
需求是幾個人從小到大站隊。
教官先找最小的放在第一位,于是,記住現在第一個人的身高去跟后面的每一個比個,一旦發現有更矮的,就記住這個更矮的,繼續比,直到找到最矮,并把最矮的和第一位的人換位置,以此類推。
//選擇排序法:
let array1 = [2,34,2,3,5,256,7,4,23,2,34,213,12,4125,6];
function selectionSort(arr){
for(let n=0; n<arr.length-1; n++){
let min = arr[n];
let idx = n;
for(let m=n+1; m<arr.length+n; m++){
if(min>arr[m]){
min = arr[m];
idx = m;
}
}
swap(arr,n,idx);
}
return arr;
}
//交換函數:
function swap(array,a1,a2){
var a = array[a1];
array[a1] = array[a2];
array[a2] = a;
return array;
}
console.log(array1)
console.log(selectionSort(array1));
-
摸牌法(插入法)
需求是牌從小到大排列。
開始摸牌,第二張和第一張比,如果大于第一張,就放在后面,否則放前面。摸第三張牌,往前找,如果出現比自己小,就放在這張牌后面。以此類推。
我的方法:
let array1 = [2,34,2,3,5,256,7,4,23,2,34,213,12,4125,6];
//摸牌法
function insertionSort(arr){
for(let i=1; i<arr.length; i++){
for(let j=0; j<i; j++){
if(arr[i]<arr[j]){
swap(arr,i,j);
}
}
}
return arr;
}
//交換函數:
function swap(array,a1,a2){
var a = array[a1];
array[a1] = array[a2];
array[a2] = a;
return array;
}
console.log(array1)
console.log(insertionSort(array1));
網上某大神的方法:(甚為精妙)
function insertionSort(arr){
let value,
j,
i;
for(i=0;i<arr.length;i++){
value = arr[i];
for(j=i-1; j> -1 && arr[j]>value;j--){
arr[j+1] = arr[j];
}
arr[j+1] = value;
}
return arr;
}
-
領導分配任務法——遞歸(不會)
需求是將任務從小到大排列。
拿到任務,大領導將任務分給兩個主管,每個主管又將自己的任務分給下屬,層層分配,最后一級將拿到的兩個任務大小進行排序,他的上級同樣操作,以此類推。
-
快速排序——自私算法(不會)
需求是從大到小排序。
第一個不考慮其他人排序,而是只考慮自己的位置。即我只要找一個位置,這個位置滿足前面的都比我小,后面的都比我大,那這個位置就是我的正確位置。以此類推。
-
隨機算法——解決自私算法bug(同側為同小或同大時)(不會)
道理同上,只不過這次不是按照順序,從第一個開始,依次往下,而是隨機的抽取一個,然后去找自己的位置。
這樣做可以解決同一側都是比自己大或小的情況,節省時間。
-
桶排法
在排序之前,我先準備幾個桶(桶順序從小到大),然后把相同高度的放在一個桶里,不同高度放在響應的桶里。放好之后在按照桶的順序一個個拿出來。
-
基數排法
每一位進行比較,放在桶里,在按照從小到大順序拿出,以此類推。