zoukankan      html  css  js  c++  java
  • 算法学习冒泡排序和快速排序

    冒泡排序

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

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

    假设有一组数据[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;
    };
    
    优秀文章首发于聚享小站,欢迎关注!
  • 相关阅读:
    ThreadPoolExecutor线程池参数设置技巧
    函数式接口
    Mac下进入MySQL命令行
    Java8 特性
    Java8 :: 用法 (JDK8 双冒号用法)
    事务传播
    新版IDEA配置tomcat教程(2018)
    Java8 Map的compute()方法
    Spring 普通类与工具类调用service层
    简单工厂(三)——JDK源码中的简单工厂
  • 原文地址:https://www.cnblogs.com/yesyes/p/15349360.html
Copyright © 2011-2022 走看看