js排序算法05——快速排序

终于到了传说中的快速排序算法了,快速排序的思想和归并排序一样,都是采用分治思想,不同之处在于归并每次将数组一分为二,最后将小的数组进行比较,合并为大数组。快排是每次找一个主元,也就是基准数,按照这个基准数,把小于基准数的数放左边,大于基准数的数放右边,通过基准数来分组实现排序。所以快排的很重要一步就是选择主元,主元选取的是否合适直接影响到算法的效率。我的方法是每次从子数组中三个数(首、尾、中),取他们的中位数作为主元,分析到此结束,直接上code

function quickSort(arr,left,right){
    if(right-left<=1){
        return arr;
    }
    else{
        var l=left,r=right,m=parseInt((r+l)/2);
        var pivot,cup;
        if(arr[l]>arr[m]){
            cup = arr[m];
            arr[m] = arr[l];
            arr[l] = cup;
        }
        if(arr[m]>arr[r]){
            cup = arr[m];
            arr[m] = arr[r];
            arr[r] = cup;
        }
        if(arr[l]>arr[m]){
            cup = arr[m];
            arr[m] = arr[l];
            arr[l] = cup;
        }
        pivot = arr[m];
        cup = arr[r-1];
        arr[r-1] = arr[m];
        arr[m] = cup;
        var i=0,j=r-2;
        while(i<j){
            while(arr[i]<pivot){
                i++;
            }
            while(arr[j]>pivot){
                j--;
            }
            if(i<=j){
                cup = arr[i];
                arr[i] = arr[j];
                arr[j] = cup;
                i++;
                j--;
            }
        }
        cup = arr[i];
        arr[i] = arr[r-1];
        arr[r-1] = cup;
        quickSort(arr,l,i-1);
        quickSort(arr,i,r);
        return arr;
    }
}

哈哈,比较简单粗暴,其实可以把交换位置的部分封装成一个函数的,在此就不赘言了。快排属于非稳定算法,时间平均时间复杂度为O(nlogn);在处理大量随机数的排序时,表现很好的。

原文地址:https://www.cnblogs.com/renbo/p/8338258.html

时间: 2024-10-03 23:01:02

js排序算法05——快速排序的相关文章

js排序算法基础--快速排序

快速排序 快速排序也是最常用的排序算法,和归并算法一样,快速排序也采用分治的方法,将原始数组分为较小的数组.(但是并没有像归并排序那样将它们分开) 思路: 1.从数组中选择中间一项作为主元: 2.创建两个指针,左边一个指向数组的第一项,右边指向数组最后一项.移动左指针直到我们找到一个比主元大的元素,接着,移动右指针直到找到一个比主元小的元素.然后交换它们,重复这个过程,直到左指针超过了右指针.这个过程是的比主元小的值都排在了主元之前,而比主元大的值都排在了主元之后,这一步叫划分操作. 3.接着,

结构-行为-样式-Js排序算法之 快速排序

快速排序算法,是我的算法系列博客中的第二个Js实现的算法,主要思路:    在一个数组中随机取一个数(一般都取第一个或者最后一个),使这个数与数组中其他数进行比较,如果比它大就放到它的右边,比它小就放到这个数的左边,依次递归调用直到比较队列中只有两个数. 代码实现: var arrs = [23,85,61,37,55,12,63,11,99,39,70,21,23]; function QuickSort(arr , s,e){ var len = e; var token = arr[s];

js排序算法

利用js来实现一些常见的排序算法,在面试中问得还是挺多的,下面我就其进行了简单的总结. sort()方法 首先要讲讲JS数组排序的sort方法,它实现的原理是通过两两比较的方法,sort()方法按升序排列数组项,即最小的值位于最前面,最大的值位于最后面,为了实现排序,sort()方法会调用每个数组项的toString()方法,然后比较得到的字符串,即使数组中的每一项都是数值,sort方法比较的也是字符串.因此有必要定义一个比较函数: function compare(value1,value2)

排序算法 之 快速排序

快速排序是基于分治思想的一种排序算法,就像该方法的名字一样,速度比较快,所以叫做快速排序:它的平均时间复杂度为O(N*logN),最坏时间复杂度为O(n2),由于快速排序在序列元素数量多的时候速度比较快,所以很多语言内置的排序方法也是用快速排序实现的.快速排序也有很多优化的版本,比如在排序时基数的选择等等-下面就说一下一般的快速排序的实现. 基本思想: 快速排序的基本思想就是,先从待排序的序列中任选一个元素作为基数,然后将序列中的其他小于基数的元素放在基数的左边,大于或等于基数的元素放在基数的右

常用排序算法之——快速排序(C语言+VC6.0平台)

经典排序算法中快速排序具有较好的效率,但其实现思路相对较难理解. #include<stdio.h> int partition(int num[],int low,int high) //以key为基准 将待排数列“高”.“低 ”两部分,“高”部分的所有数据比key大,“低”部分的数据都比key小 { int left,right,key; left=low;right=high;key=num[low]; while(left<right) { while(left<right

常用排序算法之——快速排序

快速排序的原理: 首先找一个标兵值,等于某一个元素值:遍历数组,将数组分为小于标兵值和大于标兵值的两部分:然后分别对两个部分采用快速排序,递归. 分开数组时,维持一个指针,指向已找到小部分的最后一个元素:一个指针用于遍历. 不稳定排序算法.当数组已经有序时,时间复杂度最差,为O(N2),平均.最优情况下都为O(N lgN). 代码如下: 1 #include <iostream> 2 using namespace std; 3 4 template<typename T> 5 v

排序算法系列——快速排序

记录学习点滴 快速排序算法是一种很有趣的算法,短小精悍,性能强劲,对于大部分情况都可以胜任,但对极端环境难以应付. 快速排序我理解为:这是一个“以自我为中心的”+“分治法”思想的算法. 分治法不必多说,化繁为简,那就是逐个击破. 那什么是“以自我为中心”?顾名思义,就是每次都一个“我”,每个人都要围绕“我”行事,比“我”小的都去左边站着,比“我”他大的都去右边站着,而且“我”不去关心每一边都有谁,反正你没“我”大或者小就行.一旦“我”落位了妥帖了,“我”就不动了.然后再在左右两边分别产生新“我”

排序算法之快速排序Java实现

排序算法之快速排序 舞蹈演示排序: 冒泡排序: http://t.cn/hrf58M 希尔排序:http://t.cn/hrosvb  选择排序:http://t.cn/hros6e  插入排序:http://t.cn/hros0W  快速排序:http://t.cn/ScTA1d  归并排序:http://t.cn/Sc1cGZ 快速排序是一个就地排序,分而治之,大规模递归的算法.从本质上来说,它是归并排序的就地版本. 1.快速排序可以由下面四步组成:(1) 如果不多于1个数据,直接返回.(2

经典排序算法之快速排序(C语言版)

快速排序是一种很常用的排序算法. /*  * 快速排序(伪算法) 2016-04-20 23:34:16  * 1.先找到第一个元素的最终位置  * 2.对第一个元素的最终位置之前的元素,进行快速排序.  * 3.对第一个元素的最终位置之后的元素,进行快速排序.  * */ extern void QuickSort(int a[],int low,int high);//第二个参数表示第一个元素的下标,第三个参数表示最后一个元素的下标 extern int FindPos(int a[], i