算法学习-冒泡排序和快速排序

冒泡排序

冒泡排序是最简单的一种排序算法,同时也会效率最低的,因此在开发中很少使用这种算法进行排序

冒泡排序通过比较任何两个相邻的项,如果第一个比第二个大,则交换它们,元素项向上移动至
正确的顺序,就好像气泡升至表面一样,因此叫冒泡排序。

假设有一组数据[5,4,3,2,1],使用冒泡排序的比较过程如下

实现冒泡排序

function bubbleSort(array) {
  var length = array.length;
  for (var i = 0; i < length; i++) {
    for (var j = 0; j < length - 1 - i; j++) {
      if (array[j] > array[j + 1]) {
        // ES6语法:位置交换
        [array[j], array[j + 1]] = [array[j + 1], array[j]];
      }
    }
  }
  return array;
};

快速排序

JS数组有一个sort方法用于排序,chrome浏览器的v8引擎在实现sort时使用的就是快排,由于其出色的排序效率,快排是一种使用很频繁的排序算法。

快排的基本实现分为三步:

1. 在数据集之中,选择一个元素作为"基准"(pivot)。

2. 所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。

3. 对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

假设现在有一组数据[85, 24, 63, 45, 17, 31, 96, 50],使用快速排序,运行过程如下所示

  1. 选择中间的元素45作为"基准"(基准值可以任意选择,但是选择中间的值比较容易理解)

  1. 按照顺序,将每个元素与"基准"进行比较,形成两个子集,"小于45"在左边,"大于等于45"在右边

  1. 对两个子集不断重复第一步和第二步,直到所有子集只剩下一个元素为止

结果

使用JS实现快速排序算法

var quickSort = function(arr) {
  // 检查数组的元素个数,如果小于等于1,说明排序已完成,返回数组
  if (arr.length <= 1) { return arr; }

  // 选择"基准"(pivot),并将其与原数组分离,再定义两个空数组,用来存放一左一右的两个子集
  var pivotIndex = Math.floor(arr.length / 2);
  var pivot = arr.splice(pivotIndex, 1)[0];
  var left = [];
  var right = [];
  // 小于"基准"的元素放入左边的子集,大于基准的元素放入右边的子集
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] < pivot) {
      left.push(arr[i]);
    } else {
      right.push(arr[i]);
    }
  }

  // 使用递归不断重复这个过程
  return quickSort(left).concat([pivot], quickSort(right));
};

顺序搜索

顺序或线性搜索是最基本的搜索算法,它的机制是将每一个数据结构中的元素和我们要找的元素做比较,直到找到匹配的元素。

顺序搜索是最低效的一种搜索算法,下面是顺序搜索的实现

function sequentialSearch(item, array){
  for (var i=0; i<array.length; i++){
    if (item === array[i])
      return i;
    }
  }
  return -1;
};

二分搜索

二分搜索算法的原理和猜数字游戏类似,就是有人说“我正想着一个1到100的数字”的游戏。我们每回应一个数字,那个人就会说这个数字是高了、低了还是对了。这个算法要求被搜索的数据结构已排序,以下是该算法遵循的步骤

  1. 选择数组的中间值。
  2. 如果选中值是待搜索值,那么算法执行完毕(值找到了)。
  3. 如果待搜索值比选中值要小,则返回步骤1并在选中值左边的子数组中寻找。
  4. 如果待搜索值比选中值要大,则返回步骤1并在选中值右边的子数组中寻找。
function binarySearch(item, array) {
  // quickSort(array); 先排序
  var low = 0,
    high = array.length - 1,
    mid, element;
  while (low <= high) {
    mid = Math.floor((low + high) / 2);
    element = array[mid];
    if (element < item) {
      low = mid + 1;
    } else if (element > item) {
      high = mid - 1;
    } else {
      return mid;
    }
  }
  return -1;
};
posted @ 2021-09-28 18:43  wmui  阅读(223)  评论(0编辑  收藏  举报