常见的几种排序方法

 大家好,我是IT修真院武汉分院第八期的学员庄引,一枚正直纯洁善良的WEB前端程序员。

今天给大家分享一下,修真院官网JS任务11,深度思考中的知识点——常见的几种排序方法?

1.背景介绍

在计算机科学与数学中,一个排序算法(英语:Sorting algorithm)是一种能将一串资料依照特定排序方式进行排列的一种算法。 最常用到的排序方式是数值顺序以及字典顺序。有效的排序算法在一些算法(例如搜寻算法与合并算法)中是重要的, 如此这些算法才能得到正确解答。 排序算法也用在处理文字资料以及产生人类可读的输出结果。 基本上,排序算法的输出必须遵守下列两个原则:

输出结果为递增序列(递增是针对所需的排序顺序而言)

输出结果是原输入的一种排列、或是重组

虽然排序算法是一个简单的问题,但是从计算机科学发展以来,在此问题上已经有大量的研究。 更多的新算法仍在不断的被发明。

2.知识剖析

查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中。因为其实现代码较短,应用较常见。 所以在面试中经常会问到排序算法及其相关的问题。但万变不离其宗,只要熟悉了思想,灵活运用也不是难事。 一般在面试中最常考的是快速排序和归并排序,并且经常有面试官要求现场写出这两种排序的代码。 对这两种排序的代码一定要信手拈来才行。还有插入排序、冒泡排序、堆排序、基数排序、桶排序等。

常见的几种算法:

①冒泡算法

②选择排序

③插入排序

④快速排序

 3.常见问题

问题一:各种排序算法用JavaScript 如何实现?

问题二:各种排序算法的优劣及其应用?

4.解决方案

问题一:各种排序算法用JavaScript 如何实现?

问题二:各种排序算法的优劣及其应用?

4.解决方案

冒泡排序

冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素, 如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有元素再需要交换, 也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。

冒泡排序演算法的运作如下:

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

代码实现:

Array.prototype.bubbleSort= function() {

vari,j,temp;

for(i=0;i< this.length-1;i++)

for(j=0;j< this.length-1-i;j++)

if(this[j]> this[j+1]) {

temp= this[j];

this[j]= this[j+1];

this[j+1]=temp;

}

return this;

};

组组组组组组组组组组,34,3,32,82,55,89,50,37,5,64,35,9,70];//定义一个数组

num.bubbleSort();//数组调用冒泡排序算法

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素, 然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 选择排序的思想其实和冒泡排序有点类似,都是在一次排序后把最小的元素放到最前面。但是过程不同, 冒泡排序是通过相邻的比较和交换。而选择排序是通过对整体的选择。

Array.prototype.selectionSort= function() {

vari,j,min;

vartemp;

for(i=0;i< this.length-1;i++) {

min=i;

for(j=i+1;j< this.length;j++)

if(this[min]> this[j])

min=j;

temp= this[min];

this[min]= this[i];

this[i]=temp;

}

return this;

};

组组组组组组组组组组,34,3,32,82,55,89,50,37,5,64,35,9,70];//定义一个数组

num.selectionSort();//数组定义选择排序算法

插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的 工作原理是通过构建有序序列,对于未排序数据, 在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序 (即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位, 为最新元素提供插入空间。

1.从第一个元素开始,该元素可以认为已经被排序

2.取出下一个元素,在已经排序的元素序列中从后向前扫描

3.如果该元素(已排序)大于新元素,将该元素移到下一位置

4.将新元素插入到该位置后

5555555~5

Array.prototype.insertionSort= function() {

for(vari=1;i< this.length;i++) {

vartemp= this[i];

varj=i-1;

//如果将赋值放到下一行的for循环内,会导致在第13行出现j未声明的错误

for(;j>=0&& this[j]>temp;j--) {

this[j+1]= this[j];

}

this[j+1]=temp;

}

return this;

}

组组组组组组组组组组,34,3,32,82,55,89,50,37,5,64,35,9,70];//定义一个数组

num.insertionSort();//数组调用插入排序算法

快速排序

快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort), 一种排序算法, 最早由东尼·霍尔提出。在平均状况下,排序n个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较, 但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n)演算法更快, 因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。

步骤为:

从数列中挑出一个元素,称为"基准"(pivot),

重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任一边)。在这个分割结束之后,该基准就处于数列的中间位置。这个称为分割(partition)操作。

递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序。

递归到最底部时,数列的大小是零或一,也就是已经排序好了。这个演算法一定会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

Array.prototype.quickSort= function() {

varlen= this.length;

if(len<=1)

return this.slice(0);

varleft=[];

varright=[];

varmid=[this[0]];

for(vari=1;i

if(this[i]

left.push(this[i]);

else

right.push(this[i]);

returnleft.quickSort().concat(mid.concat(right.quickSort()));

};

vararr=[5,3,7,4,1,9,8,6,2];

arr=arr.quickSort();

5.编码实战

6.扩展思考

各种排序算法的时间复杂度和空间复杂度

算法优劣评价术语

稳定性:

稳定:如果 a 原本在 b 前面,而 a = b,排序之后 a 仍然在 b 的前面;

不稳定:如果 a 原本在 b 的前面,而 a = b,排序之后 a 可能会出现在 b 的后面;

排序方式:

内排序:所有排序操作都在内存中完成,占用常数内存,不占用额外内存。

外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行,占用额外内存。

复杂度:

时间复杂度: 一个算法执行所耗费的时间。

空间复杂度: 运行完一个程序所需内存的大小。

常见的几种排序方法_第1张图片

7.参考文献

参考一:JavaScript 排序算法汇总

8.更多讨论

还有那些经典排序算法?

常用的排序算法?_腾讯视频

PPT链接:常用的排序算法


技能树.IT修真院

“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。

这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧 !

http://www.jnshu.com/login/1/86157900

你可能感兴趣的:(常见的几种排序方法)