JavaScript 冒泡排序

来源:互联网 发布:李俊峰的霍去病 知乎 编辑:程序博客网 时间:2024/06/14 20:41

1.从首部开始,将最大值向后移动

function bubbleSort1(arr) {    for(var i = 0; i < arr.length - 1; i++){        for(var j = 0; j < arr.length - i - 1; j++){            if(arr[j] > arr[j+1]){                var tmp = arr[j];                arr[j] = arr[j+1];                arr[j+1] = tmp;            }        }    }}

数据轨迹 : 初始值[4,2,3,1,9,7,8,5,6]

数据轨迹

内循环每次只比较并交换两个元素.
上面的写法的外循环每次步进总是将最大的一个元素放到末尾,可看成向后冒泡.
要想向前冒泡,外循环每次步进总是把最小的元素放到头部,可以这么写

2.从首部开始,将最小值想首部移动

function bubbleSort2(arr) {    for(var i = 0; i < arr.length; i++){        for(var j = i + 1; j < arr.length; j++){            if(arr[i] > arr[j]){                var tmp = arr[j];                arr[j] = arr[i];                arr[i] = tmp;            }        }    }}

数据轨迹 : 初始值[4,2,3,1,9,7,8,5,6]

数据轨迹

向前冒泡可以保证前面指定位置是有序的,向后冒泡,则反之

从尾部开始,将最小值向前移动

function bubbleSort3(arr){    for(i= 0; i < arr.length; i++){        for(var j = arr.length - 1; j > i; j--){            if(arr[j] < arr[j-1]){                var temp = arr[j];                arr[j] = arr[j-1];                arr[j-1] = temp;            }        }    }}

问题:上面的所有排序方法在时间复杂度上,最差的情况是O(n^2),最好的情况也是O(n^2)
原因:排序到一半发现数组已经有序,但排序仍在继续
可以设置标记unordered,如果再一次内循环中数组没有发生一次交换(即数组已然有序),
可以将unordered设置为false,这样最好的情况可以是O(n)

function sort(arr) {    var unordered = true;    for(var i = 0; i < arr.length - 1 && unordered; i++){           unordered = false;        for(var j = 0; j < arr.length - i - 1; j++){            if(arr[j] > arr[j+1]){                var tmp = arr[j];                arr[j] = arr[j+1];                arr[j+1] = tmp;                unordered = true;            }        }    }}

也可以看到优化后排序算法,向后排序和向前排序所用的循环次数是不同的

原创粉丝点击