冒泡排序&直接插入排序&快速排序
一、冒泡排序
0 1 2 3 4 5
假设有一个6个数的数组,0,1,2,3,4,5是索引,冒泡排序就是相邻两个对比,比如5和4比,如果满足条件就互换位置,然后4和3比,3和2比,2和1比,1和0比。第一趟循环下来,把最大或最小的数放到0,第二趟循环,把0-4中最大或最小的数放到1。。。
冒泡排序有两层循环,外层循环控制需要几趟循环,1趟循环可以将最大或最小的数放到0的位置,第2次循环可以将次最大或次最小的数放到1的位置,以此类推,需要length-1趟循环。所以外层为for(var i=1;i<length;i++)
再看里层循环,对比时会用到a[j]和a[j-1]对比,那么第一趟循环中,j-1最小的位置为0(i=1);第二趟循环中j-1最小的位置为1(i=2);所以在第i趟循环中,j-1的位置为i-1;那么j的位置为i;因此里层循环为for(var j=length-1;j>=i;j--)
所以冒泡排序法为
function Bubble(arr){
    var flag=true;
    var len=arr.length;
    for(var i=1;i<len&&flag;i++){
        flag=false;  // 初始化flag为false,如果有交换位置就将它置换为true,否则终止循环,因为已经有序了
        for(var j=len-1;j>=i;j--){
            if(arr[j]<arr[j-1]){
                // 交换位置
                flag=true;
            }
        }
    }
    return arr;
}
时间复杂度O(n2),冒泡排序是稳定的排序算法。
二、选择排序
选择排序就是每一次选出数组中最小或者最大的数字的下标,然后和第一个数组元素交换,然后选出次大或次小的数字下标,和第二个数组元素交换。
function selectSort(arr){
    var len=arr.length;
    for(var i=1;i<len;i++){
        min=i-1;
        for(var j=i;j<len;j++){
           if(arr[min]>arr[j]){
               min=j;
           }
        }
        if(min!=i-1){
            var temp=arr[min];
             arr[min]=arr[i-1];
             arr[i-1]=temp;
        }
    }
    return arr;
}
时间复杂度为O(n2), 但是性能上优于冒泡排序。是不稳定的排序算法。
三、直接插入排序
0 1 2 3 4 5
假设有一个6个数的数组,0,1,2,3,4,5是索引
假设0 1都是排序好的数,那么现在要把2插入到0 和1 中,按升序排列,2先和1比,如果2比1大那么2保持位置不变,不再继续比较。如果2比1小,那么2和1位置互换,然后2再和0比
同样的两层循环,第一层循环,先是插入1,然后插入2,然后是插入3.。。。最后插入5,因此需要length-1次插入,外层循环就为for(var i=1;i<arr.length;i++)
第二层循环是用要插入的数假设是i,和0到i-1比较,因此for(var j=i-1;j>=0;j--)
for(var i=1;i<arr.length;i++){
  var temp=arr[i];  //temp保存要插入的数
   var position=i;
  for(var j=i-1;j>=0;j--){
    if(temp<arr[j]){// 如果要插入的数比它之前的数小,那么互换位置
      arr[j+1]=arr[j];
      position--;
    }else{
      break; //如果要插入的数比它前一个数大,那么跳出里层循环。因为前面的数都是升序排列的,如果比相邻的前一个数大,那么也肯定大于之前的其他数
    }
  }
}
四、快速排序
快速排序主要分三步
(1)在数据集之中,选择一个元素作为"基准"(pivot)。
(2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。
(3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
function quickSort(arr){
 if(arr.length<=1)return arr;
  var midIdx=Math.floor(arr.length/2);
  var mid=arr.splice(midIdx,1)[0];
  var left=[];
  var right=[];
  for(var i=0;i<arr.length;i++){
      if(arr[i]<mid){
          left.push(arr[i]);
        }else{
          right.push(arr[i]);
        }
    }
  return quickSort(left).concat(mid,quickSort(right));
}
冒泡排序&直接插入排序&快速排序的更多相关文章
- 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)
		
本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...
 - 冒泡排序与插入排序(C#实现)
		
本人应届生面试,发现被问了2次关于排序的算法.当时竟然没写出来!!!好吧,可能是用库函数多了,很久没搞算法了,在纸上写没感觉吧. 今天花了1个多小时写了下冒泡排序与插入排序(C#实现),并写了注释和小 ...
 - JavaScript 数据结构与算法之美 - 冒泡排序、插入排序、选择排序
		
1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算 ...
 - Javascript中的冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序  算法性能分析
		
阿里面试中有一道题是这样的: 请用JavaScript语言实现 sort 排序函数,要求:sort([5, 100, 6, 3, -12]) // 返回 [-12, 3, 5, 6, 100],如果你 ...
 - JS实现冒泡排序,插入排序和快速排序(从input中获取内容)
		
以前参加面试的时候,被问到过让用JS实现一个快速排序,当时太年轻,并没有回答上来. 于是,这里便把三种排序都用JS来做了一下.结合html,从input文本框中获取输入进行排序. 关于这几种算法的原理 ...
 - 【C++】冒泡排序、插入排序、快速排序
		
#include<iostream> using namespace std; void BubbleSort(int *a,int istart,int len)//冒泡排序 { //a ...
 - JavaScript新手学习笔记3——三种排序方式(冒泡排序、插入排序、快速排序)
		
每种编程语言学到数组的时候,都会讲到排序算法,当时学C语言的时候,卡在排序算法.今天来总结一下javascript中如何实现三种排序算法. 1.冒泡排序(默认升序排列哦) 原理: 冒泡排序的原理,顾名 ...
 - 用js实现算法:冒泡排序、插入排序和快速排序
		
一.冒泡排序 function bubbleSort(arr){ for(var i=0;i<arr.length;i++){ for(var j=0;j<arr.length-i-1;j ...
 - js三种经典排序:冒泡排序、插入排序、快速排序
		
冒泡排序: function bubbleSort(arr){ for(var r=1;r<arr.length-1;r++){ for(var i=0;i<arr.length-r;i+ ...
 
随机推荐
- django中的路由规则
			
项目的目录结构 外层的firstysite目录与Django无关,只是你项目的容器,可以任意重命名. #其中settings.py是django的总配置文件,即项目的总管家#urls.py,则是项目的 ...
 - web服务发展历程
			
PhP发展历史1.php: 开始名字含义:personal home page 个人网页 现在名字含义:HyperText Perprocessor 超文本预处理语言 预处理: 说明PHP是在服务器预 ...
 - 关于在eclipse中安装各种插件的问题
			
在eclipse中安装php插件的方法 参考转载链接:eclipse 安装php插件 并配置环境 elipse的php插件地址:https://www.eclipse.org/pdt/ 以下可能会用到 ...
 - [MySQL] TRUNCATE数据库所有表,打印所有TRUNCATE表语句
			
将XXX替换成数据库名称,然后执行SQL,将执行结果拷贝出来执行就可以TRUNCATE数据库所有表了. select CONCAT('truncate table XXX.',TABLE_NAME,' ...
 - Android——系统权限
			
Android是一个特权分隔的操作系统,每一个应用程序运行在不同的系统身份中(Linux的user ID和group ID).系统部分和不同的身份被隔离开来.因此,Linux隔离了应用程序(与其它程序 ...
 - js 详解setTimeout定时器
			
setTimeout: 定时器函数 第一个参数是匿名函数,第二个参数是延迟执行时间 setTimeout(function(){},time) 注意: 1.setTimeout函数是Window对象提 ...
 - Linux 7.X 网络配置
			
Linux 7.X 网络配置 环境: 笔记本中安装了虚拟机,在虚拟机中安装了Redhat 7.4版本的操作系统,现配置该操作系统网络.(IP.网关等) 相关指令如下: # nmcli connecti ...
 - 使用 store 来优化 React 组件
			
在使用 React 编写组件的时候,我们常常会碰到两个不同的组件之间需要共享状态情况,而通常的做法就是提升状态到父组件.但是这样做会有一个问题,就是尽管只有两个组件需要这个状态,但是因为把状态提到了父 ...
 - Linux的登录和退出
			
Linux是一个多用户的操作系统,用户要使用该系统,首先必须登录系统,使用完系统后,必须退出系统. 本章主要讨论登录和退出系统的方法: 用户登录系统时,为了使系统能够识别自己,必须输入用户名和密码,经 ...
 - Directx11教程(57) 环境映射
			
原文:Directx11教程(57) 环境映射 建好skydome后,如果我们想让其中的某个物体,比如那个球体来映射出周围环境的蓝天白云(不包括自己附近的物体),该怎么做呢?此时可以把这个 ...