冒泡排序
冒泡排序,作为最基础的算法之一,属于选择算法中的一种简单比较算法。其复杂度在最简单情况下为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;
}