JavaScript排序

本文深入讲解了五种经典排序算法:快速排序、冒泡排序、插入排序、选择排序及JavaScript的arr.sort()方法。通过动态图展示每种算法的实现过程,详细解析了算法原理、步骤,并提供了代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、快速排序

数组值:

var arr = [12,23,54,34,12,2,34,53,1,32,4,24,21,90];

原理动态图:

快速排序

实现思想:

数组二分法和递归调用

实现步骤:

(1)在数据集之中,找一个基准点
(2)以基准点为大小建立两个数组。分别左边数组存储比基准点小的数,右边数组存储比基准点大的数。
(3)利用递归进行循环比较

var arr = [12,23,54,34,12,2,34,53,1,32,4,24,21,90];
function quickSort(obj){
	if (obj.length<=1) {
	//如果数组只有一个数,就直接返回;
		return obj;
	}
    //中间数的索引值,如果是浮点数,则向下取整
	var centerIndex = Math.floor(obj.length/2);
	//中间值
	var indexValue = obj.splice(centerIndex,1);
	var leftArr = [];
	var rightArr = [];
	var calculation = 0;//总共执行次数
	for(var i = 0; i < obj.length; i++){
		if (indexValue>obj[i]) {
		//基准点的左边的数传到左边数组
			leftArr.push(obj[i]);
		}else{
		//基准点的右边的数传到右边数组
			rightArr.push(obj[i]);
		}
	}
	//递归不断重复比较
return quickSort(leftArr).concat([indexValue],quickSort(rightArr));
}
console.log(quickSort(arr).toString());
//1,2,4,12,12,21,23,24,32,34,34,53,54,90

2、冒泡排序

原理动态图:

冒泡排序

实现思路:

两层循环对比交换位置

实现步骤:

(1) 外层for循环遍历元素,下标为:i。
(2)内层for循环负责移动索引进行比较。内层索引从j= i +1开始,直到数组末尾,对比arr[i]与a[j]大小,a[i]>a[j]交换彼此位置。
(3)循环遍历直到结束

function bubbleSort(obj){
	for(var i = 0, len = obj.length; i < len; i++){
		for(var j = i+1; j < len; j++){
			if (obj[i]>obj[j]) {
				var temp = obj[i];
				obj[i] = obj[j];
				obj[j] = temp;
			}
		}
	}
	return obj;
}
console.log(bubbleSort(arr));
//(14) [1, 2, 4, 12, 12, 21, 23, 24, 32, 34, 34, 53, 54, 90]

3、插入排序

实现原理图

实现原理图

实现思想:

从第二个位置开始循环依次和之前位置的值比较

实现步骤:

(1)当前值(current)从第二位置开始循环数组
(2)依次和它(current)前面的位置(preIndex)比较大小,前面的位置值(arr[preIndex])大,交换位置

function insertSort(obj){
  var preIndex,current;
  for(var i = 1; i < obj.length; i++){
  	  preIndex = i - 1;
  	  current = obj[i];
  	  while(preIndex>=0 && obj[preIndex]>current){
  	  	 obj[preIndex+1] = obj[preIndex];
  	  	 preIndex--;
  	  }
  	  obj[preIndex+1] = current;
  }
  return obj;
}
console.log(insertSort(arr));
//(14) [1, 2, 4, 12, 12, 21, 23, 24, 32, 34, 34, 53, 54, 90]

3、arr.sort([sortby])方法排序

实现思想

sort说明
(1)如果调用sort()方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。
(2)如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:

  • <1>若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
  • <2>若 a 等于 b,则返回 0。
  • <3>若 a 大于 b,则返回一个大于 0 的值。

实现步骤

 var arr = [43, 5, 7, 43, 28, 986, 4, 1,1,2,5,7];
 arr.sort(function(a, b) {
     return a - b;
 });
 arr.sort((a, b) => a - b);//和上面的效果一样
 console.log(arr);//(12) [1, 1, 2, 4, 5, 5, 7, 7, 28, 43, 43, 986]

4、选择排序

选择排序是表现最稳定的排序算法之一 ,因为无论什么数据进去都是O(n2)的时间复杂度 ,所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。理论上讲,选择排序可能也是平时排序一般人想到的最多的排序方法了吧。

选择排序(Selection-sort) 是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

4.1、代码实现

1、算法描述

  • 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。

  • 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

  • 重复第二步,直到所有元素均排序完毕。
    2.2 动图演示
    演示图

   /**
     * 选择排序
     * @param array
     * @return
     */
    function selectionSort(array) {
        if (array.length == 0)
            return array;
        for (int i = 0; i < array.length; i++) {
            int minIndex = i;
            for (int j = i; j < array.length; j++) {
                if (array[j] < array[minIndex]) //找到最小的数
                    minIndex = j; //将最小数的索引保存
            }
            int temp = array[minIndex];
            array[minIndex] = array[i];
            array[i] = temp;
        }
        return array;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值