问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

简单介绍一下快速排序的思想?

发布网友 发布时间:2022-04-22 17:00

我来回答

2个回答

懂视网 时间:2022-04-22 21:22

这篇文章主要介绍了关于JavaScript实现快速排序的算法思想,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

目前,最常见的排序算法大概有七八种,其中"快速排序"(Quicksort)使用得最广泛,速度也较快。它是图灵奖得主 东尼·霍尔(C. A. R. Hoare)于1960时提出来的。

快速排序"的思想很简单,整个排序过程只需要三步:

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

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

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

举例来说,现在有一个数据集{85, 24, 63, 45, 17, 31, 96, 50},怎么对其排序呢?

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

  第二步,按照顺序,将每个元素与"基准"进行比较,形成两个子集,一个"小于45",另一个"大于等于45"。

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

按照之前的步骤,定义一个quickSort函数:

var quickSort = function(arr) { //参数是一个数组
  if (arr.length <= 1) { return arr; } //检查数组的元素个数,如果小于等于1,就返回。
  var pivotIndex = Math.floor(arr.length / 2); //选择"基准"(pivot),并将其与原数组分离,再定义两个空数组,用来存放一左一右的两个子集。
  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));
};

实现上面动画:

算法思路:

  1. 从数列中挑出一个元素,称为 “基准”(pivot);

  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出 之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

实现代码:

function quickSort(arr, left, right) { 
  var len = arr.length,
  partitionIndex,
  left = typeof left != 'number' ? 0 : left,
  right = typeof right != 'number' ? len - 1 : right;
 
 
  if (left < right) {
  partitionIndex = partition(arr, left, right);
  quickSort(arr, left, partitionIndex-1);
  quickSort(arr, partitionIndex+1, right);
  }
  return arr;
}
function partition(arr, left ,right) { // 分区操作
  var pivot = left,  // 设定基准值(pivot)
    index = pivot + 1;
  for (var i = index; i <= right; i++) {
    if (arr[i] < arr[pivot]) {
      swap(arr, i, index);
      index++;
    }
  }
  swap(arr, pivot, index - 1);
   return index-1;
}
 
function swap(arr, i, j) {
  var temp = arr[i];
  arr[i] = arr[j];
  arr[j] = temp;
}
function partition2(arr, low, high) {
  let pivot = arr[low];
  while (low < high) {
    while (low < high && arr[high] > pivot) {
    --high;
    }
    arr[low] = arr[high];
    while (low < high && arr[low] <= pivot) {
    ++low;
    }
    arr[high] = arr[low];
  }
  arr[low] = pivot;
  return low;
}
 
function quickSort2(arr, low, high) {
  if (low < high) {
  let pivot = partition2(arr, low, high);
  quickSort2(arr, low, pivot - 1);
  quickSort2(arr, pivot + 1, high);
  }
  return arr;
}

热心网友 时间:2022-04-22 18:30

基本思想  快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 快排 算法过程  设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。一趟快速排序的算法是:
  1)设置两个变量I、J,排序开始的时候:I=1,J=N-1;
  2)以第一个数组元素作为关键数据,赋值给X,即 X=A[0];
  3)从J开始向前搜索,即由后开始向前搜索(J=J-1),找到第一个小于X的值,让该值与X交换;
  4)从I开始向后搜索,即由前开始向后搜索(I=I+1),找到第一个大于X的值,让该值与X交换;
  5)重复第3、4步,直到 I=J;
  例如:待排序的数组A的值分别是:(初始关键数据:X=49)
  A[0] 、 A[1]、 A[2]、 A[3]、 A[4]、 A[5]、 A[6]:
  49 38 65 97 76 13 27
  进行第一次交换后: 27 38 65 97 76 13 49
  ( 按照算法的第三步从后面开始找)
  进行第二次交换后: 27 38 49 97 76 13 65
  ( 按照算法的第四步从前面开始找>X的值,65>49,两者交换,此时:I=3 )
  进行第三次交换后: 27 38 13 97 76 49 65
  ( 按照算法的第五步将又一次执行算法的第三步从后开始找
  进行第四次交换后: 27 38 13 49 76 97 65
  ( 按照算法的第四步从前面开始找大于X的值,97>49,两者交换,此时:J=4 )
  此时再执行第三步的时候就发现I=J,从而结束一躺快速排序,那么经过一趟快速排序之后的结果是:27 38 13 49 76 97 65,即所以大于49的数全部在49的后面,所以小于49的数全部在49的前面。
  快速排序就是递归调用此过程——在以49为中点分割这个数据序列,分别对前面一部分和后面一部分进行类似的快速排序,从而完成全部数据序列的快速排序,最后把此数据序列变成一个有序的序列,根据这种思想对于上述数组A的快速排序的全过程如图6所示:
  初始状态 {49 38 65 97 76 13 27}
  进行一次快速排序之后划分为 {27 38 13} 49 {76 97 65}
  分别对前后两部分进行快速排序 {27 38 13} 经第三步和第四步交换后变成 {13 27 38} 完成排序。
  {76 97 65} 经第三步和第四步交换后变成 {65 76 97} 完成排序。
  变种算法  快速排序(Quicksort)有三个值得一提的变种算法,这里进行一些简要介绍:
  平衡快排(Balanced Quicksort): 每次尽可能地选择一个能够代表中值的元素作为关键数据,然后遵循普通快排的原则进行比较、替换和递归。
  外部快排(External Quicksort): 与普通快排不同的是,关键数据是一段buffer,首先将之前和之后的M/2个元素读入buffer并对该buffer中的这些元素进行排序,然后从被排序数组的开头(或者结尾)读入下一个元素,假如这个元素小于buffer中最小的元素,把它写到最开头的空位上;假如这个元素大于buffer中最大的元素,则写到最后的空位上;否则把buffer中最大或者最小的元素写入数组,并把这个元素放在buffer里。保持最大值低于这些关键数据,最小值高于这些关键数据,从而避免对已经有序的中间的数据进行重排。完成后,数组的中间空位必然空出,把这个buffer写入数组中间空位。然后递归地对外部更小的部分,循环地对其他部分进行排序。
  三路基数快排(Three-way Radix Quicksort,也称作Multikey Quicksort、Multi-key Quicksort): 结合了基数排序(radix sort,如一般的字符串比较排序就是基数排序)和快排的特点,是字符串排序中比较高效的算法。该算法被排序数组的元素具有一个特点,即multikey,如一个字符串,每个字母可以看作是一个key。算法每次在被排序数组中任意选择一个元素作为关键数据,首先仅考虑这个元素的第一个key(字母),然后把其他元素通过key的比较分成小于、等于、大于关键数据的三个部分。然后递归地基于这一个key位置对“小于”和“大于”部分进行排序,基于下一个key对“等于”部分进行排序。
简单介绍一下快速排序的思想?

它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 快排 算法过程设要排序的数组是A[0]……A[N-1],首先任意选取一个数...

什么叫快速排序

快速排序是平均速度最快的排序方法,思想如下:每趟选中一个元素,并把这个元素插入到它的正确位置。具体是每趟排完之后,选中元素的左边都小于它,右边元素都大于它。然后再分别对其左边部分和右边部分进行快速排序。

什么是快速排序?

快速排序又称分区交换排序,是对冒泡排序的改进,快速排序采用的思想是分治思想。。算法原理: (1)从待排序的n个记录中任意选取一个记录(通常选取第一个记录)为分区标准;(2)把所有小于该排序列的记录移动到左边,把所有大于该排序码的记录移动到右边,中间放所选记录,称之为第一趟排序;(3)然后对...

快速排序的思想

快速排序所采用的思想是分治的思想。常见的快速排序方法包括冒泡排序、选择排序、插入排序、快速排序、归并排序等。这些排序方法的原理和实现方式各不相同,但其核心思想都是通过比较和交换数据的位置来达到排序的目的。冒泡排序是一种简单的排序方法,它的主要思想是通过不断交换相邻元素的位置来将较大的元素...

快速排序的基本思想

快速排序的基本思想:快速排序基本思想是采用分治法。具体来说,它将一个大的数组分成两个子数组,将子数组分别进行排序,然后再将排好序的子数组进行合并,得到最终的排序结果。快速排序的核心在于分区操作,即如何将一个大的数组分成两个子数组,使得其中一个子数组的所有元素都小于另一个子数组的所有...

快速排序法1.算法的基本思想

快速排序算法的核心思想基于分治策略。首先在数据序列中选择一个元素作为基准,将所有比基准小的元素移动到它的左边,比基准大的元素移动到它的右边。接着对左右两边的子序列分别重复上述过程,直到每个子序列的长度为1,排序完成。在无序区R[1..H]中随机选取一个数据元素作为基准X。将R[1..H]划分为...

快排是什么

在最好的情况下,快速排序的性能可以接近O。但在最坏的情况下,性能可能较差。尽管如此,由于其高效性和实现的简单性,快速排序在许多场合仍然是一种首选的排序算法。通过上述解释,我们可以了解到快速排序是一种基于分治思想的排序算法,通过将待排序序列不断分割并递归地排序子序列来实现整体的排序。

极简算法笔记——快速排序

快速排序是一种高效的排序算法,其核心思想是选择一个元素作为基准(哨兵),将数组分为前后两部分,前一部分元素均小于基准,后一部分元素均大于基准。具体步骤如下:1. 选取一个元素作为基准,通常选择数组的第一个元素、最后一个元素或中间元素。2. 遍历数组,将小于基准的元素交换至基准的左边,将...

快速排序方法的简单解释

快排的思想是(假设都是从小到大排列):选一个值作为“轴值”,所有小于轴值的都移动到轴值左边,所有大于轴值的都移动到轴值右边。这一步是让数列变得较为有序 然后分别再对轴值的左边、右边分别进行快排,一步一步提高整个数列的有序程度,直到最后完全有序。轴值的选取有多种方式,这里就假设...

快速排序,看了解释还是不会,求通俗点的

快速排序简单的说就是选择一个基准,将比起大的数放在一边,小的数放到另一边。对这个数的两边再递归上述方法。如本题 66 13 51 76 81 26 57 69 23,以66为基准,升序排序的话,比66小的放左边,比66大的放右边, 类似这种情况 13 。。。 66。。。69 具体快速排序的规则...

快速排序总比简单排序快 简述快速排序的基本思想 快速排序法的基本思想 快速排序的算法思想 快速排序使用的算法思想 借助于快速排序的算法思想 简述冒泡排序的基本思想 快速排序 冒泡排序 简单快速排序
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
做了好乱的梦,求解! ae缺少p1效果是要装什么插件? ...荣耀》中“网络诊断”居然可以测定酒店有无摄像头,这是好事吗? 七叶一枝花花苞里面的红米是什么 q了是什么意思? ...Q就可以,格式也没错,也只几十K,别人发给我都可以,哪里出问题了... 显的么说友Q在微 ?Q上新示怎让在说我空里动间的态不更好博 诺诗兰户外品牌怎么样 新隋唐英雄传张卫健萧妃是刘小庆吗 红尖椒和朝天椒介绍!红尖椒和朝天椒哪个辣? 六年级小学生怎样赚钱啊?要一次赚多点! 小学生寒假如何赚钱 抽油烟机4vf的可以用6vf的能用吗? 欧派抽烟机和方太抽烟机哪种好 学生党买蓝牙耳机,要求品质好价格合适的,有没有推荐的牌子呢? 方太抽油烟机与欧派抽油烟机哪款更好些? 欧派和方太油烟机哪个好 索爱是不是中国品牌??? 索爱品牌简介 索爱是哪个国家的 索爱是什么品牌哦?介绍一下! 正常的恶露是不是都有点腥臭味儿 多久流干净 产后恶露多久才能排干净?夏天较热,总是有腥臭味怎么办? 索爱是品牌吗? 索爱到底是哪个国家的品牌 恶露干净后白带黄有酸臭味怎么回事 打印机怎么放条码 索爱(Soaiy)和索尼爱立信是同一个公私么?有个错字不会打. 为什么磁铁会吸附在冰箱上 磁铁对冰箱有害吗 举办公务员培训讲座的目的 针对2011年甘肃省省考,最近有没有公务员培训班举办大型讲座 ???急求 丹东公务员面试培训班最近有讲座么? 广东浦清最近有组织公务员培训讲座吗? 现在报名温岭国家公*笔试培训课程有没有优惠啊?听说有免费的讲座是真的吗? 甘肃公务员培训讲座哪有? 桃树结果需要什么肥料? 氨基酸叶面肥是什么?可以促进果树坐果吗? 磷肥对果树的作用是怎样的,该怎样科学施肥呢? 广东金刚网纱窗卡扣还是上螺丝好 苹果的mini和air有什么区别 摧忙果树希要什么肥料 ipad air与mini区别 苹果平板电脑mini和air有什么区别 阜新有什么好玩的 阜新有啥好玩的地方不? [请问]阜新的历史发展? 怎么解决unity做VR项目全景图扭曲的问题 在unity中模型加上贴图后发现一定角度贴图扭曲变形怎么办,是什么原因 unity 怎么使模型看起来具有旋转扭曲感