js实现冒泡排序,快速排序,插入排序及原生sort的使用
2019-03-11 19:54
531 查看
1、冒泡排序
原理:数组中有n个数,比较相邻的两个数,如果后面的数小于前面的数,则两者交换。一轮完成后,此时最大的数据已经在最后,此时进行第二轮,确定倒数第二个数,依次几轮就可完成,如下图详解:
图中我们可以看出,我们仅需要arr.length-1轮,且每轮比较的次数也逐渐减少,代码如下:
[code]//冒泡排序,从小到大 var arr = [5, 7, 4, 8, 3]; //1 外层循环:控制比較的轮数,arr.length - 1轮 for (var i = 1; i < arr.length; i++) { //2 内层循环:控制每一轮中比較的次数 //for (var j = 0; j < arr.length - i - 1; j++) {//需要设置var i = 0; for (var j = 0; j < arr.length - i; j++) {//需要设置var i = 1; //3 比較当前项和后项的大小关系,如果当前项大,进行交换即可 if (arr[j] > arr[j + 1]) { var temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } }
此时简单的冒泡排序完成了,但是如果数据仅需要一轮排序就已经达到想要的结果了,下面的几轮就没有必要了,所以需要对以上代码进行优化,原理就是当一轮中没有触发任何交换的时候,跳出排序即可,代码如下:
[code]//冒泡排序,从小到大 var arr = [5, 7, 4, 8, 3]; //1 外层循环:控制比較的轮数,arr.length - 1轮 for (var i = 1; i < arr.length; i++) { //----用于记录,本轮中,发生交换的次数 var count = 0; //2 内层循环:控制每一轮中比較的次数 //for (var j = 0; j < arr.length - i - 1; j++) {//需要设置var i = 0; for (var j = 0; j < arr.length - i; j++) {//需要设置var i = 1; //3 比較当前项和后项的大小关系,如果当前项大,进行交换即可 if (arr[j] > arr[j + 1]) { var temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; //----进入到if中说明发生了交换,设置count++ count++; } } //----当本轮中所有次的比較完毕后,判断 //如果count依然为0,说明排序完毕,将循环结束即可 if (count == 0) { break;//跳出循环(结束当前循环的执行) } }
2、快速排序
原理:取数组中间位置的数据,跟所有数据比较,比该数小的放一新数组,大的放一新数组,使用递归,拼接数据,最后得到想要的数组
快速排序是由缺点的,它是不稳定的,如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面。
[code]//快速排序 function quickSort(arr) { //判断数组长度,如果小于等于1的话,直接返回元素 if (arr.length <= 1) { return arr; } var pivotIndex = Math.floor(arr.length/2),//获取数组中间位置的索引 pivot = arr.splice(pivotIndex, 1)[0],//获取中间数据 small = [],//比中间数小的 large = [];//比中间数大的 //遍历去除中间数据的数组,添加至相对应的数组里面 for (var i = 0; i < arr.length; i++) { if (arr[i] < pivot) { small.push(arr[i]) } else { large.push(arr[i]) } } //使用递归直到数据拆分完成 return quickSort(small).concat([pivot], quickSort(large)); }
3、插入排序
原理:拿自己和前面的数比较,如果比自己大,让他依次往后移动一个位置,直到前面的数自己小,放入该位置。
[code]//插入排序 function insertionSort(arr) { //便利数组 //从第二个开始 for (var i = 1; i < arr.length; i++) { var key = arr[i]; var j = i - 1; while (arr[j] > key) { //比当前数大的依次向后移动 arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; } return arr; }
4、js 自带的sort
详细介绍请参考w3school
[code]//升序 arr.sort(function (a, b) { return a - b; }) console.log(arr) //降序 arr.sort(function (b, a) { return a - b; })
彩蛋:如果对各排序原理不是很理解的话,可下载《算法动画图解》APP查看,里面有详细步骤,在最下方可设置中文,方便使用。
相关文章推荐
- 用JS实现冒泡排序、插入排序、选择排序、快速排序
- Python实现冒泡排序、选择排序、插入排序、快速排序、归并排序、二分法查找算法(基于《算法导论》伪代码)
- Java实现排序(快速排序、冒泡排序、选择排序、基数排序、插入排序)
- Java实现冒泡排序、快速排序、选择排序、插入排序和归并排序
- 数组排序-冒泡排序-选择排序-插入排序-希尔排序-快速排序-Java实现
- 几种基本排序的实现:选择排序,冒泡排序,插入排序,堆排序,快速排序,归并排序
- 基本算法简单实现-二分法查找、合并排序、冒泡排序、插入排序、选择排序、快速排序
- 选择排序、冒泡排序、插入排序、基数排序、快速排序、归并排序完整C++实现
- JS使用sort方法实现冒泡排序和乱序
- JAVA实现选 4000 择排序、冒泡排序、插入排序、归并排序、希尔排序、堆排序和快速排序
- 元素排序几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- (一)Java实现排序,选择排序,快速排序,冒泡排序,插入排序
- JS中使用sort结合localeCompare实现中文排序实例
- C#实现所有经典排序算法(选择排序,冒泡排序,快速排序,插入排序,希尔排序)
- 插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序——C++实现
- PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】
- python 实现插入排序,冒泡排序,快速排序,选择排序
- js实现常见的三种排序方法(冒泡排序、快速排序、归并排序)
- JS中使用sort结合localeCompare实现中文排序实例
- JS实现冒泡排序,插入排序和快速排序并排序输出