Partition算法及Partition算法用于快速排序

JavaScript简单方便,所以用JavaScript实现,可以在Chrome控制台下观察运行结果。主要实现Partition算法,比如输入为 
  var array = [4, 2, 1, 3, 6, 8, 9, 7, 5]; 
  partition(array, 0, 8); 
那么按照array[0]即4进行划分,结果为 [3, 2, 1, 4, 6, 8, 9, 7, 5] 
?1. [代码][JavaScript]代码

// 先来看Partition算法,Partition算法是快速排序的基础
<script type="text/javascript">
    // 划分算法
   function partition(array, p, r) {
      if(p < 0 || r < 0 || p >= r || r > array.length-1)
        return;
       
      var i = p;
      var pivot = array[i];
      for(var j = p+1; j <= r; j++) {
         if(array[j] < pivot) {
            i++;
            var temp = array[j];
            array[j] = array[i];
            array[i] = temp;
         }
      }
       
      // 交换array[i]和array[p]
      var temp = array[p];
      array[p] = array[i];
      array[i] = temp;
       
      return i;
  }
   
  var array = [4, 2, 1, 3, 6, 8, 9, 7, 5];
  partition(array, 0, 8);
  console.log(array);
</script>
2. [代码][JavaScript]代码   
// 基于上面的Partition算法,获得下面的快速排序算法
<script type="text/javascript">矢量素材
    // 划分算法http://www.huiyi8.com/shiliang/?
   function partition(array, p, r) {
      if(p < 0 || r < 0 ||  p >= r || r > array.length-1)
        return;
       
      var i = p;
      var pivot = array[i];
      for(var j = p+1; j <= r; j++) {
         if(array[j] < pivot) {
            i++;
            var temp = array[j];
            array[j] = array[i];
            array[i] = temp;
         }
      }
       
      // 交换array[i]和array[p]
      var temp = array[p];
      array[p] = array[i];
      array[i] = temp;
       
      return i;
  }
   
  function quickSort(array, p, q) {
     if(p > q || p < 0 || q < 0 || q > array.length-1)
        return;
      
     if(p==q)   // 递归终止条件
        return;
      
     var mid = partition(array, p, q);
     quickSort(array, p, mid-1);
     quickSort(array, mid+1, q); 
  }
   
  var array = [4, 2, 1, 3, 6, 8, 9, 7, 5];
  quickSort(array, 0, 8);
   
  console.dir(array);
</script>
?

Partition算法及Partition算法用于快速排序

时间: 2024-10-09 21:25:00

Partition算法及Partition算法用于快速排序的相关文章

算法导论 第7章 快速排序

快速排序在最坏情况下的时间复杂度为O(n^2),虽然在最坏情况下运行时间比较差,但是快速排序通常是用于排序的最佳选择,因为其平均性能相当好,期望的运行时间为O(nlgn),且在O(nlgn)的记号中隐含的常数因子很小. 快速排序和合并排序有相似之处,都是需要划分序列,在合并排序中,划分的过程很简单,直接选择元素序列的中间位划分位置,排序是在合并的过程中实现的,所以合并排序的合并过程很重要:相比合并排序,快速排序就没有合并的过程,只有划分,快速排序的划分过程很重要,排序是在划分的过程中实现的. /

算法导论第七章快速排序

一.快速排序概述 关于快速排序,我之前写过两篇文章,一篇是写VC库中的快排函数,另一篇是写了快排的三种实现方法.现在再一次看算法导论,发现对快速排序又有了些新的认识,总结如下: (1).快速排序最坏情况下的时间复杂度为O(n^2),虽然最坏情况下性能较差,但快排在实际应用中是最佳选择.原因在于:其平均性能较好,为O(nlgn),且O(nlgn)记号中的常数因子较小,而且是稳定排序. (2).快速排序的思想和合并排序一样,即分治.快排排序的分治思想体现在: a.首先从待排序的数中选择一个作为基数,

常用算法之排序算法三【快速排序】

快速排序是东尼·霍尔在1962提出的划分交换排序,并采用一种分治的策略.在这,我们先总结一下:快速排序 = 划分交换排序 + 分治.然后我们在一一介绍他. 划分交换排序 在讨论它时,感觉有种看了崔颢<黄鹤楼>之后,再去写黄鹤楼的感觉,因为MoreWindows写 得白话经典算法系列之六 快速排序 快速搞定已经足够出色了.我在这只是进行简单的复述,你需要了解更多请看他的博文. 先来看看划分交换排序的具体算法描述: 1.从数列中选出一个数作为基准 2.从数组中选出比它大的数放右边,比它小的数放左边

JavaScript 数据结构与算法之美 - 归并排序、快速排序、希尔排序、堆排序

1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习. 之所以把归并排序.快速排序.希尔排序.堆排序放在一起比较,是因为它们的平均时间复杂度都为 O(nlogn). 请大家带着问题:快排和归并用的都是分治思想,递推公式和递归代码也非常相似,那它们的区别在哪里呢 ? 来阅读下文. 2. 归并排序(Merge Sort) 思想 排序一个数

java:快速排序算法与冒泡排序算法

 Java:快速排序算法与冒泡算法 首先看下,冒泡排序算法与快速排序算法的效率: 如下的是main方法: public static void main(String[] args) { //快速排序算法测试 int[] qArray = new int[100000]; for (int i = 0; i < 100000; i++){ qArray[i] = (int) (Math.random() * 100000); } long beforeQ = System.currentTi

算法与数据结构(七):快速排序

在上一篇中,回顾了一下针对选择排序的优化算法--堆排序.堆排序的时间复杂度为O(nlogn),而快速排序的时间复杂度也是O(nlogn).但是快速排序在同为O(n*logn)的排序算法中,效率也是相对较高的,而且快速排序使用了算法中一个十分经典的思想--分治法:因此掌握快速排序还是很有必要的. 快速排序的基本思想如下: 在一组无序元素中,找到一个数作为基准数. 将大于它的数全部移动到它的右侧,小于它的全部移动到右侧. 在分成的两个区中,再次重复1到2 的步骤,直到所有的数全部有序 下面还是来看一

Nagle 算法(TCP中用于拥塞控制)详解

算法适应的情况和原理 在广域网上,小分组会增加拥塞的可能性,一种简单且好用的方式是使用Negla算法. 该算法要求一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到来之前不发送其他的小分组.相反,TCP收集这些少量的分组,并在确认到来之时以一个分组的形式发送出去.这样,就能够减少网络中小分组的数量,提高数据包的利用率. 算法优势:自适应,确认到达的越快,数据发送也就越快. 关闭算法 有时也需要关闭该算法.一个典型的例子是X窗口服务器,小消息(例如鼠标移动)不能缓存发送,因为

【C/C++学院】0907-象棋五子棋代码分析/寻找算法以及排序算法

象棋五子棋代码分析 编译代码报错: 错误 1 error MSB8031: Building an MFC project for a non-Unicode character set is deprecated. You must change the project property to Unicode or download an additional library. See http://go.microsoft.com/fwlink/p/?LinkId=286820 for mo

在Object-C中学习数据结构与算法之排序算法

笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速排序 双路快速排序 三路快速排序 堆排序 总结与收获 参考与阅读 选择排序 选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n2) 的时间复杂度.所以用到它的时候,数据规模越小越好.唯一的好处可能就是不占用额外的内存空间了吧. 1.算法步骤 首先在未排序序列中找到最小(大)元素,存放到排