冒泡排序的JavaScript实现
1. 普通冒泡
思想
假设有n个数,按从小到大排序:
- 进行n-1次外循环,每次外循环会排好当前处理的数中的最大数,即进行第一次外循环排好所有数中的最大数,进行第二次外循环排好所有数中的次大数....直到第n-1次外循环,排好第n-1大的数,也就是倒数第二小的数,那么剩下的那个就是最小的数
- 在第i+1次外循环中,只需要处理前n-i-1个数,因为后面的i+1个数已经排好。即此时内循环需要比较前n-i-1个数。
- 在内循环中,依次比较两个相邻项,如果前面一项比后面一项大,则交换他们。最终,内循环处理完这前n-i-1个数后,会把这n-i-1个数中最大的那个数排到第n-i-1的位置上。
代码
function bubbleSort(arr) {
const length = arr.length;
for (let i = 0; i < length - 1; i++) {
let changeOccur = false; //用于标记某次外循环中,是否方式内循环交换事件
for (let j = 0; j < length - i -1; j++) {
if (arr[j] > arr[j+1]) {
/*
const temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
*/
//这三行的交换函数用ES6来写:
[arr[j], arr[j+1]] = [arr[j+1], arr[j]];
changeOccur = true;
}
}
if (!changeOccur) { //如果一次外循环中,没有发生一次内循环交换,那么可以直接结束排序比较
break;
}
}
}
性能分析
- 时间复杂度:最好O(n),平均、最坏O(n^2)
- 空间复杂度: O(1), 稳定
2. 鸡尾酒排序
思想
双向的冒泡排序。
代码
function coaktailBubbleSort(arr) {
const length = arr.length;
let low = 0;
let high = length - 1;
while(low < high) {
let changeOccur = false;
for (let j = low; j < high; j++) {
if(arr[j] > arr[j+1]) {
[arr[j], arr[j+1]] = [arr[j+1], arr[j]];
changeOccur = true;
}
}
if(!changeOccur) {
break;//如果一次交换也没有发生,那直接就可以跳出,结束排序
}
high--;
changeOccur = false;
for (let j = high; j > low; j--) {
if (arr[j] < arr[j-1]) {
[arr[j-1], arr[j]] = [arr[j], arr[j-1]];
changeOccur = true;
}
}
if(!changeOccur) {
break;
}
low++;
}
}
延伸:对比冒泡排序的C语言实现:
1. 普通冒泡
# include<stdio.h>
void bubble(int *list,int len)
{
int i,j,t,flag=0;
for(i=0;i<len-1;i++)
{
flag=0;//设置标记,当某一轮交换没有交换任何数,那下一轮交换也不必进行了
for(j=0;j<len-1-i;j++)
{
if(list[j]>list[j+1])
{
t=list[j];
list[j]=list[j+1];
list[j+1]=t;
flag=1;
}
}
if(flag==0)
{
break;
}
}
}
void main()
{
int n,list[10];
printf("请输入10个整数:");
for(n=0;n<10;n++)
{
scanf("%d",&list[n]);
}
printf("\n");
bubble(list,10);
for(n=0;n<10;n++)
{
printf("%d\t",list[n]);
}
printf("\n");
}
2. 鸡尾酒冒泡
#include<stdio.h>
void CocktailBubble(int *list,int n)
{
int low=0,high=n-1,j,t,flag;
while(low<high)
{
flag=0;//一次进行两趟for循环,第一个for循环排最大值(次大值),第二个for循环排最小值(次小值),只要其中一趟没有交换任何数字就可以结束排序
for(j=low;j<high;j++)
{
if(list[j]>list[j+1])
{
t=list[j];
list[j]=list[j+1];
list[j+1]=t;
flag=1;
}
}
if(flag==0)
{
break;
}
high--;//上述for循环第一次结束,排完最大值;第二次,排完次大值
flag = 0;
for(j=high;j>low;j--)
{
if(list[j]<list[j-1])
{
t=list[j];
list[j]=list[j-1];
list[j-1]=t;
flag = 1;
}
}
if(flag==0)
{
break;
}
low++;//上述for循环第一次结束,排完最小值;第二次,排完次小值
}
}
void main(){
int i,list[10];
printf("请输入10个整数:");
for(i=0;i<10;i++){
scanf("%d",&list[i]);
}
for(i=0;i<10;i++){
printf("%d ",list[i]);
}
printf("\n");
CocktailBubble(list,10);
for(i=0;i<10;i++){
printf("%d ",list[i]);
}
printf("\n");
}
冒泡排序的JavaScript实现的更多相关文章
- 冒泡排序之javascript
冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字 ...
- Javascript中,实现十大排序方法之一(冒泡排序及其优化设想)
冒泡排序的Javascript实现 首先定义一个取值范围在(0~100000)之间的随机值的长度为10万的数组, function bubbleSort(arr) { console.time('冒泡 ...
- 算法之冒泡排序手写之js写法andjava写法
对于经典算法,你是否也遇到这样的情形:学时觉得很清楚,可过阵子就忘了? 本系列文章帮助你解决这个问题. 其实排序算法,仔细品读他的名字就见名知意了. 比如冒泡排序就很形象,遍历n次,每次循环相邻元素两 ...
- JavaScript算法(冒泡排序、选择排序与插入排序)
冒泡排序.选择排序与插入排序复杂度都是二次方级别的,放在一起说吧. 介绍一些学习这三个排序方法的比较好的资料.冒泡排序看<学习JavaScript数据结构与算法>介绍的冒泡排序,选择排序看 ...
- 冒泡排序 & 选择排序 & 插入排序 & 希尔排序 JavaScript 实现
之前用 JavaScript 写过 快速排序 和 归并排序,本文聊聊四个基础排序算法.(本文默认排序结果都是从小到大) 冒泡排序 冒泡排序每次循环结束会将最大的元素 "冒泡" 到最 ...
- JavaScript实现冒泡排序、快速排序、插入排序
JavaScript实现冒泡排序.快速排序.插入排序 时间:2014-01-09 18:05:51 来源: 作者:胡晗 冒泡排序的基本思想:所谓冒泡就是泡泡一个一个往上冒,让体积最轻的泡泡浮在最上 ...
- Javascript中的冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序 算法性能分析
阿里面试中有一道题是这样的: 请用JavaScript语言实现 sort 排序函数,要求:sort([5, 100, 6, 3, -12]) // 返回 [-12, 3, 5, 6, 100],如果你 ...
- JavaScript新手学习笔记3——三种排序方式(冒泡排序、插入排序、快速排序)
每种编程语言学到数组的时候,都会讲到排序算法,当时学C语言的时候,卡在排序算法.今天来总结一下javascript中如何实现三种排序算法. 1.冒泡排序(默认升序排列哦) 原理: 冒泡排序的原理,顾名 ...
- javascript的冒泡排序, 快速排序, 选择排序, 插入排序
冒泡排序, 最经典的排序, 把比较大的数字往后放, 和选择排序恰恰相反: <!DOCTYPE html> <html lang="en"> <head ...
随机推荐
- [nowcoder]最长区间
链接:https://www.nowcoder.com/acm/contest/158/B 求最长连续严格递增序列 线段树模板题,码力弱的一匹调了半天.. 代码: #include<iostre ...
- 关于jquery的each遍历,return只终止当前循环,不好使的解决办法
很奇怪,一般来说return会终止js,但是今天万万没想到的是,jquery 的each循环中,return不好使,做一记录, var result = true; $('input[type=&qu ...
- CentOS7/6 关闭防火墙
CentOS6关闭防火墙使用以下命令, //临时关闭 service iptables stop //禁止开机启动 chkconfig iptables off CentOS7中若使用同样的命令会报错 ...
- spark学习14(spark local模式运行spark程序的报错)
报错1 java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries. 解 ...
- JAVA实现计算三角形等平面图形的夹角问题
问题重现 现在一平面上有三点,分别是x(x1,x2),y(y1,y2),z(z1,z2),图形大致如下 现要求用java代码求出∠YxZ的度数. 问题分析及数学模型 1.要求两直线的夹角,就想到数学中 ...
- JNI简单步骤01
1.环境变量 1.1.相应的环境变量中,加入如下内容:(Windows) (1).ClASSPATH中输入 : ".;C:\Program Files\Java\jdk1.7.0_07\jr ...
- Samba的安装配置使用
////////////////////////////////Samba//////////////////////////////////////////// 小常识:在同一局域网中,两个系统的工 ...
- selenium学习笔记(HTMLTestRunner测试报告)
之前提到selenium加入unittest框架.可以引入HTMLTestRunner扩展.以此来生成测试报告 首先是分享下载的百度云地址 http://pan.baidu.com/s/1pKUItW ...
- Django进阶Model篇004 - ORM常用操作
一.增加 create和save方法 实例: 1.增加一条作者记录 >>> from hello.models import * >>> Author.object ...
- 异步请求(ajax,http) 之 逐渐完善的大全
异步请求在我们的开发之中是经常需要学习和理解的内容,我们将会在这一篇文章中依据不同的语言和环境内容进行归类讲解. JS: ajax是我们最为常用的页面异步请求,在只需要修改部分页面内容而不需要更换全部 ...