冒泡排序
冒泡排序,作爲最基礎的算法之一,屬於選擇算法中的一種簡單比較算法。其複雜度在最簡單情況下爲O(n), 最複雜情況下爲O(n2),也常作爲面試必考算法。本篇主要通過Javascript來實現冒泡排序以及其優化過程。
1、冒泡排序
function popoSort(arr=[]){
if(arr.length <= 0) {
return arr;
}
const len = arr.length;
for(let i = 0; i < len; i++){
for(let j=i+1;j < len; j++){
// 如果前面的元素比後面的大,則交換元素,最終結果就是
if(arr[j] > arr[i]){
let temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
return arr;
}
2、第一層優化
在上述算法中,如果在一次遍歷中,發現元素沒有進行交換了,那說明數組已然有序,這時候就無須做多餘比較了。用一個標記去標記上一次遍歷是否發生過交換,如果沒有,那說明數組已經有序,則無需再遍歷。
function popoSort(arr=[]){
if(arr.length <= 0) {
return arr;
}
const len = arr.length;
for(let i = 0; i < len; i++){
let flag = 0;
for(let j=i+1;j < len; j++){
// 如果前面的元素比後面的大,則交換元素,最終結果就是
if(arr[j] > arr[i]){
let temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
flag = 1;
}
}
if(flag === 0) {
return arr;
}
}
return arr;
}
3、第二層優化
在第一次優化中,只是增加了數組有序條件的判定。其實在數組還未完全有序時,因爲已經部分有序了,有些多餘的比較也可省略,這裏可以用一個temPosition記錄上一次遍歷交換的最後一個元素的索引。下次比較只需要到這次索引終止即可。
function popoSort(arr=[]){
if(arr.length <= 0) {
return arr;
}
let len = arr.length ;
let temPosition = 0;
for(let i = 0; i < arr.length; i++){
let flag = 0;
for(let j=i+1;j < len; j++){
// 如果前面的元素比後面的大,則交換元素,最終結果就是
if(arr[j] > arr[i]){
let temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
flag = 1;
// 記錄上一次遍歷的位置
temPosition = j;
}
}
//len = temPosition;
if(flag === 0) {
return arr;
}
}
return arr;
}