排序算法总结

78 阅读3分钟

1.冒泡排序

冒泡排序是指两两进行对比,大的元素移到后面,俗称冒泡

思路:

第一次循环,两两对比,找出数组中最大的元素,放到数组的最后一位

第二次循环,找出第二大元素,放到数组的倒数第二位中,依次类推

function bubble(arr) {
  for(let i = 0; i <arr.length; i++) {
    for(let j = 0; j < arr.length-1-i; j++) {
      if(arr[j] > arr[j+1]) { // 交换
        [arr[j], arr[j+1]] = [arr[j+1], arr[j]]
      }
    }
  }
}

tips:

JavaScript实现冒泡排序

2.选择排序

找出当前数组的最小元素,将其放在数组的前面,依次类推

function selection(arr) {
  for(let i = 0; i < arr.length-1; i++) {
    let minIndex = i
    for(let j = i+1; j < arr.length; j++) {
      if (arr[j] < arr[minIndex]) minIndex = j
    }
    // 知道当前未排序数组的最小项为minIndex
    // 交换
    [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]]
  }
}

3.插入排序

插入排序是将数组分成已排序和未排序部分,默认数组的第一个元素为已排序,依次取未排序的元素,与已排序的元素从右到左进行对比,如果已排序的元素大于未排序的元素,则已排序的元素向后移动一位,直到找到未排序的元素正确的位置为止

function insert(arr) {
	for (let i = 1; i < arr.length; i++) {
  	// 当前需要排序的元素
  	const currentItem = arr[i]
    // 遍历已排序部分
    for (let j = i-1; j >= 0; j--) {
    	if (currentItem < arr[j]) {
      	// 已排序元素向后移动,为未排序元素腾出位置
        arr[j+1] = arr[j]
			} else { // 找到对应的位置
				break
			}
		}
    // 插入到对应的位置
    arr[j+1] = currentItem
	}
}
function insert(arr) {
  for(let i = 1; i < arr.length; i++) { // 未排序数组
    for(let j = i-1; j >= 0; j--) { // 已排序数组
      if (arr[j+1] < arr[j]) {
      	[arr[j], arr[j+1]] = [arr[j+1], arr[j]]
      }
    }
	}
}

tips:javascript实现插入排序_xm2by的博客-CSDN博客

4.快速排序

取出数组的中间元素作为基数,遍历整个数组,比基数小的放在左边数组,比基数大的放在右边数组,一直处理到待遍历的数组长度为1为止,最后将左数组,基数,右数组合并

function quick(arr) {
	if (arr.length <= 1) return arr
  // 取基数
  const middleIndex = Math.floor(arr.length/2), middleItem = arr.splice(middleIndex, 1)[0]
  let leftArr = [], rightArr = []
  for (let i = 0; i < arr.length; i++) {
  	const item = arr[i]
  	if (item > middleItem) {
			rightArr.push(item)
		} else {
			leftArr.push(item)
		}
  }
  return [...quick(leftArr), middleItem, ...quick(rightArr)]
}

tips:快速排序(Quicksort)的Javascript实现 - 阮一峰的网络日志

5.归并排序

归并采用分治算法,现将数组划分为最小的有序数组,然后将这些有序数组递归合并,最后形成一个有序数组。

tips:归并排序(js实现) - JS代码

6.计数排序

适用于给定范围值的数组,通过下标进行排序。创建额外的数组,将原数组的元素值作为额外数组的下标,而额外数组的元素值代表的下标在原数组出现的次数。

7.桶排序

获取数组的最小值和最大值,确定数组元素的范围,将范围划分成任意个数,就可以确定每个桶的数量及桶的范围,遍历数组,将元素放到对应的桶里。

对桶进行排序(任意排序算法,推荐插入排序)

对桶进行合并

tips:手写算法并记住它:桶排序 - 掘金

各大排序的复杂度