一、简述
冒泡排序(Bubble Sort)是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果二者的顺序(如从大到小、首字母从A到Z)错误就交换。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。这个算法名字的由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
第一种:常规方法冒泡排序
比较相邻的两个元素,如果前一个比后一个大,则交换位置。
第一轮把最大的元素放到了最后面。
由于每次排序最后一个都是最大的,所以之后按照步骤1排序最后一个元素不用比,最理想的情况是已经按顺序排好的队列,只需要扫描一次就结束并且不需要做任何位置交换,复杂度为O(n); 最差为O(n2)
function bubbleSort(data){
if(data.length<1) return data;
let n = data.length;
for(let i=0;i<n;i++){
//因为扫描完一次后,最后一个不用比了,所以要n-i进行边界处理,达到优化性能目的
for(let j=0;j<n-i; j++){
if(data[j]>data[j+1]){
// 交换函数
let swap = data[j];
data[j] = data[j+1];
data[j+1] = swap;
}
}
}
return data;
}
第二种: 对冒泡排序的改进
声明一个变量标记顺序是否发生变化
function bubbleSort(data){
let n = data.length;
let flag = true
let swap
// 只要存在位置更换就进入循环
while(flag){
flag = false
// 每次排序最后一个都是最大的, 所有循环结束后,就得到了升序队列。
for(let i=0;i<n;i++){
if(data[i]>data[i+1]){
// 交换函数
swap = data[i]
data[i] = data[i+1]
data[i+1] = swap;
flag = true;
}
}
// /因为扫描完一次后,最后一个不用比了,所以要n--进行边界处理,达到优化性能目的
n--;
}
return data;
}
第三种: 也是对冒泡排序的一种改进
第一遍排序时将数据分成两部分,一部分比另一部分的所有数据都要小。然后递归调用,在两边都实行排序。
function bubbleSort(data) {
// 队列只有一个数或者没有数,返回原队列
if(data.length <= 1) {
return data
}
// 在队列中向取整,找到一个理论上的中间值索引
let pIndex = Math.floor(data.length/2)
// 从原队列中删除该中间值,并且取出该值。
let p = data.splice(pIndex, 1)[0]
// 小于中间值的左边部分
let left = []
// 大于中间值的右边部分
let right = []
// 通过扫描已经删除了中间值的队列,分别得到小于中间值的左边部分和大于中间值的左边部分
for(var i = 0; i<data.length; i++) {
if(data[i] < p) {
left.push(data[i])
} else {
right.push(data[i])
}
}
// 分别递归左边,右边
let nLeft = bubbleSort(left);
let nRight = bubbleSort(right)
// 返回新的队列
return nLeft.concat([p], nRight);
}
标签:队列,元素,冒泡排序,js,算法,let,排序,data From: https://www.cnblogs.com/worldforest/p/18140134