博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
快速排序与冒泡排序(面试题)
阅读量:2214 次
发布时间:2019-05-07

本文共 6494 字,大约阅读时间需要 21 分钟。

今天讲一道前端开发的笔试题,题目如下: 编写快速排序和冒泡排序,并简单对比分析.

看到题目愣了一下,知道冒泡排序,可什么是快速排序呢?

下面先来看一下冒泡排序:

方法一: 每一次对比相邻两个数据的大小,小的排在前面,如果前面的数据比后面的大就交换这两个数的位置

       var arr = [90,0,-10,88,999,100,102,2,3,20];            function sortArr1(arr){                var count = 0;    //统计循环次数                for (let i=0;i
arr[j+1]){ var temp = arr[j+1]; //如果前面的数大于后面的则交换 arr[j+1]=arr[j]; arr[j]=temp; } document.write("第"+(++count)+"次排序后:"+arr); } } return arr; } console.log(sortArr1(arr)); //[-10, 0, 2, 3, 20, 88, 90, 100, 102, 999]

方法1执行过程中输出的结果为:

第1次排序后:0,90,-10,88,999,100,102,2,3,20

第2次排序后:0,-10,90,88,999,100,102,2,3,20
第3次排序后:0,-10,88,90,999,100,102,2,3,20
第4次排序后:0,-10,88,90,999,100,102,2,3,20
第5次排序后:0,-10,88,90,100,999,102,2,3,20
第6次排序后:0,-10,88,90,100,102,999,2,3,20
第7次排序后:0,-10,88,90,100,102,2,999,3,20
第8次排序后:0,-10,88,90,100,102,2,3,999,20
第9次排序后:0,-10,88,90,100,102,2,3,20,999
第10次排序后:-10,0,88,90,100,102,2,3,20,999
第11次排序后:-10,0,88,90,100,102,2,3,20,999
第12次排序后:-10,0,88,90,100,102,2,3,20,999
第13次排序后:-10,0,88,90,100,102,2,3,20,999
第14次排序后:-10,0,88,90,100,102,2,3,20,999
第15次排序后:-10,0,88,90,100,2,102,3,20,999
第16次排序后:-10,0,88,90,100,2,3,102,20,999
第17次排序后:-10,0,88,90,100,2,3,20,102,999
第18次排序后:-10,0,88,90,100,2,3,20,102,999
第19次排序后:-10,0,88,90,100,2,3,20,102,999
第20次排序后:-10,0,88,90,100,2,3,20,102,999
第21次排序后:-10,0,88,90,100,2,3,20,102,999
第22次排序后:-10,0,88,90,2,100,3,20,102,999
第23次排序后:-10,0,88,90,2,3,100,20,102,999
第24次排序后:-10,0,88,90,2,3,20,100,102,999
第25次排序后:-10,0,88,90,2,3,20,100,102,999
第26次排序后:-10,0,88,90,2,3,20,100,102,999
第27次排序后:-10,0,88,90,2,3,20,100,102,999
第28次排序后:-10,0,88,2,90,3,20,100,102,999
第29次排序后:-10,0,88,2,3,90,20,100,102,999
第30次排序后:-10,0,88,2,3,20,90,100,102,999
第31次排序后:-10,0,88,2,3,20,90,100,102,999
第32次排序后:-10,0,88,2,3,20,90,100,102,999
第33次排序后:-10,0,2,88,3,20,90,100,102,999
第34次排序后:-10,0,2,3,88,20,90,100,102,999
第35次排序后:-10,0,2,3,20,88,90,100,102,999
第36次排序后:-10,0,2,3,20,88,90,100,102,999
第37次排序后:-10,0,2,3,20,88,90,100,102,999
第38次排序后:-10,0,2,3,20,88,90,100,102,999
第39次排序后:-10,0,2,3,20,88,90,100,102,999
第40次排序后:-10,0,2,3,20,88,90,100,102,999
第41次排序后:-10,0,2,3,20,88,90,100,102,999
第42次排序后:-10,0,2,3,20,88,90,100,102,999
第43次排序后:-10,0,2,3,20,88,90,100,102,999
第44次排序后:-10,0,2,3,20,88,90,100,102,999
第45次排序后:-10,0,2,3,20,88,90,100,102,999

方法二:

var times=0;              function sortArr2(arr){                  for(var i=0;i
arr[j]){ var temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; } console.log("第"+(++times)+"次排序后:"+arr); } } return arr; } console.log(sortArr2(arr)); //[-10, 0, 2, 3, 20, 88, 90, 100, 102, 999]
 

方法2执行过程中的结果:

第1次排序后:0,90,-10,88,999,100,102,2,3,20

第2次排序后:-10,90,0,88,999,100,102,2,3,20
第3次排序后:-10,90,0,88,999,100,102,2,3,20
第4次排序后:-10,90,0,88,999,100,102,2,3,20
第5次排序后:-10,90,0,88,999,100,102,2,3,20
第6次排序后:-10,90,0,88,999,100,102,2,3,20
第7次排序后:-10,90,0,88,999,100,102,2,3,20
第8次排序后:-10,90,0,88,999,100,102,2,3,20
第9次排序后:-10,90,0,88,999,100,102,2,3,20
第10次排序后:-10,0,90,88,999,100,102,2,3,20
第11次排序后:-10,0,90,88,999,100,102,2,3,20
第12次排序后:-10,0,90,88,999,100,102,2,3,20
第13次排序后:-10,0,90,88,999,100,102,2,3,20
第14次排序后:-10,0,90,88,999,100,102,2,3,20
第15次排序后:-10,0,90,88,999,100,102,2,3,20
第16次排序后:-10,0,90,88,999,100,102,2,3,20
第17次排序后:-10,0,90,88,999,100,102,2,3,20
第18次排序后:-10,0,88,90,999,100,102,2,3,20
第19次排序后:-10,0,88,90,999,100,102,2,3,20
第20次排序后:-10,0,88,90,999,100,102,2,3,20
第21次排序后:-10,0,88,90,999,100,102,2,3,20
第22次排序后:-10,0,2,90,999,100,102,88,3,20
第23次排序后:-10,0,2,90,999,100,102,88,3,20
第24次排序后:-10,0,2,90,999,100,102,88,3,20
第25次排序后:-10,0,2,90,999,100,102,88,3,20
第26次排序后:-10,0,2,90,999,100,102,88,3,20
第27次排序后:-10,0,2,90,999,100,102,88,3,20
第28次排序后:-10,0,2,88,999,100,102,90,3,20
第29次排序后:-10,0,2,3,999,100,102,90,88,20
第30次排序后:-10,0,2,3,999,100,102,90,88,20
第31次排序后:-10,0,2,3,100,999,102,90,88,20
第32次排序后:-10,0,2,3,100,999,102,90,88,20
第33次排序后:-10,0,2,3,90,999,102,100,88,20
第34次排序后:-10,0,2,3,88,999,102,100,90,20
第35次排序后:-10,0,2,3,20,999,102,100,90,88
第36次排序后:-10,0,2,3,20,102,999,100,90,88
第37次排序后:-10,0,2,3,20,100,999,102,90,88
第38次排序后:-10,0,2,3,20,90,999,102,100,88
第39次排序后:-10,0,2,3,20,88,999,102,100,90
第40次排序后:-10,0,2,3,20,88,102,999,100,90
第41次排序后:-10,0,2,3,20,88,100,999,102,90
第42次排序后:-10,0,2,3,20,88,90,999,102,100
第43次排序后:-10,0,2,3,20,88,90,102,999,100
第44次排序后:-10,0,2,3,20,88,90,100,999,102
第45次排序后:-10,0,2,3,20,88,90,100,102,999

总结分析:上面两种方法都实现了冒泡排序,比较的方式不一样,但是排序次数是一样的,10个数要对比45次。

---------------------------------------------此处是分割线----------------------------------------------

讲完冒泡排序,下面一起来了解一下什么是快速排序,何谓快速?就是比较更少的次数得到一样的结果。

方法一:先找到一个基准点(一般指数组的中部),然后数组被该基准点分为两部分,依次与该基准点的数字比较,

如果比它小,放左边;反之,放右边。分别用一个空数组去存储比较后的数据。最后递归执行上述操作,直到数组长度<=1;

var arr = [90,0,-10,88,99,1,102,2,3,200];            var times=0;              var quickSort=function(arr){                   //如果数组长度小于等于1无需判断直接返回即可                  if(arr.length<=1){                      return arr;                  }                  var midIndex=Math.floor(arr.length/2);//取基准点                  var midIndexVal=arr.splice(midIndex,1);//取基准点的值,splice(index,1)函数可以返回数组中被删除的那个数arr[index+1]                  var left=[];//存放比基准点小的数组                var right=[];//存放比基准点大的数组                  //遍历数组,进行判断分配                  for(var i=0;i

经过测试,随便变换数组的数,比较的次数也会改变,比如上面的数组,比较了25次。

而换成[90,0,-10,88,999,1,102,2,3,200],比较了22次,结果是[-10, 0, 1, 2, 3, 88, 90, 102, 200, 999]。

再换成[90,0,-10,88,99,1,102,2,3,20] ,比较了30次,结果是[-10, 0, 1, 2, 3, 20, 88, 90, 99, 102]。

 

方法二:直接利用数组的排序方法sort来实现

var count=0;                function sortNumber(a,b){   //定义排序规则                    console.log(count++);                      return a-b;                }                console.log(arr.sort(sortNumber));  //数组排序方法sort

同样的,经过测试,随便变换数组的数,比较的次数也会改变,比如上面的数组[90,0,-10,88,99,1,102,2,3,200];,比较了21次。

而换成[90,0,-10,88,999,1,102,2,3,200],比较了23次,结果是[-10, 0, 1, 2, 3, 88, 90, 102, 200, 999]。

再换成[90,0,-10,88,99,1,102,2,3,20] ,比较了25次,结果是[-10, 0, 1, 2, 3, 20, 88, 90, 99, 102]。

总结分析:以上两种快速排序方法的比较次数都相对少,但是随着排序的数不一样,比较的次数也会不一样.

 

最后对冒泡排序与快速排序两种方法进行对比分析:

以上两种快速排序方法都比上面的冒泡排序的比较次数少,效率高。

但是冒泡排序简单实用易于理解,而直接使用数组方法则更加简单快捷高效率的解决排序问题.

 

以上仅代表个人的见解,如果不对的地方希望大家指出.或者有更好的解决方法也希望可以分享出来学习.

 

转载地址:http://gpgyb.baihongyu.com/

你可能感兴趣的文章
Leetcode Go 《精选TOP面试题》20200628 69.x的平方根
查看>>
leetcode 130. Surrounded Regions
查看>>
【Python】详解Python多线程Selenium跨浏览器测试
查看>>
Jmeter之参数化
查看>>
Shell 和Python的区别。
查看>>
【JMeter】1.9上考试jmeter测试调试
查看>>
【虫师】【selenium】参数化
查看>>
【Python练习】文件引用用户名密码登录系统
查看>>
学习网站汇总
查看>>
【Loadrunner】性能测试报告实战
查看>>
【自动化测试】自动化测试需要了解的的一些事情。
查看>>
【selenium】selenium ide的安装过程
查看>>
【手机自动化测试】monkey测试
查看>>
【英语】软件开发常用英语词汇
查看>>
Fiddler 抓包工具总结
查看>>
【雅思】雅思需要购买和准备的学习资料
查看>>
【雅思】雅思写作作业(1)
查看>>
【雅思】【大作文】【审题作业】关于同不同意的审题作业(重点)
查看>>
【Loadrunner】通过loadrunner录制时候有事件但是白页无法出来登录页怎么办?
查看>>
【English】【托业】【四六级】写译高频词汇
查看>>