用js写了个快排,还有优化的余地

看了一天别人的代码,换换思路,写个快排。

直接上代码,低估了,原理一直记得,本以为10分钟能搞定,但出现很多小bug,整了20多分钟。

/**
 * Created by cdpmac on 15/5/15.
 */

var arr = [5, 3, 7, 4, 1, 9, 8, 6, 2];
quickSort(arr,0,arr.length-1);

console.log(arr);
function quickSort(arr,left,right){
    if( left>=right){
        return;
    }
    var index=left;  //基础标识位 第一次为0
    var hight=right;
    //退出条件,左指针和右指针重合
    for(;left<right;){
        //从右向左找
        for(var i=right;i>left;i--){
//        如果找到,则交换两项的值。
            if(arr[i]<arr[index]){
                swap(arr,index,i);
                //交换之后
                //第一次 右-》左 为 [2, 3, 7, 4, 1, 9, 8, 6, 5] index 设i为(8);
                index=i;
                break;
            }
            right--;
        }
        for(var i=left+1;i<right;i++){
            if(arr[i]>arr[index]){
                swap(arr,index,i);
                //交换之后
                //第一次 左-》右 为 [2, 3, 5, 4, 1, 9, 8, 6, 7] index 设i为(2) ;
                index=i;
                break;
            }
            left++;
        }
    }
    //第一遍完事后,原来的基准值,也就是key(0)-value(5)到了index的位置。
    //该例结果是 [ 2, 3, 1, 4, 5, 9, 8, 6, 7 ],index为5
    //再以这个index为分割点,分别对左侧和右侧 递归执行该方法
    //原index已经在正中间,不用再比较index所处位置的值,两侧分别以-1为上限 +1为下限。
    quickSort(arr,0,index-1);//这么写 当index为0时 出无限递归了
//    left:0->right:0   [ 1, 2, 3, 4, 5, 9, 8, 6, 7 ]
//    left:0->right:-1  [ 1, 2, 3, 4, 5, 9, 8, 6, 7 ]
    quickSort(arr,index+1,hight);//也有可能出递归
//    在最上方加判断 left<right  修正

}
function swap(arr,lIndex,rIndex){
    var temp = arr[lIndex];
    arr[lIndex] = arr[rIndex];
    arr[rIndex] = temp;
}
时间: 2024-10-19 03:20:54

用js写了个快排,还有优化的余地的相关文章

快速排序--QuickSort,看完五分彩开奖网平台搭建自己就能写出来的快排思路推演

快速五分彩开奖网平台搭建论坛:haozbbs.com Q1446595067排序(QuickSort)介绍首先发明者竟然敢给自己发明的算法叫做QuickSort,这个名字闪不闪亮?好比别的武功叫做六脉神剑.降龙十八掌,我这个叫做"天下无敌神功".别的排序算法都是按照特点来起的,你这个不是应该叫分块递归排序法吗?或者和希尔一样,叫做霍尔排序也可以啊,这么高调是要干啥啊?我给了他一次机会,特意去查了一下,这个名字并不是江湖朋友抬爱给的,就是发明者自己起的,社会社会...不过看完这篇博客,理

快排练习

用快排完成n(n<=100)个人年龄的从小到大的排序,要求出生年相同的按月排. 输入:第一行n个人 2到n+1行出生  年  月(1992 9) 输出:年龄的从大到小的排序. 思路:嘿嘿,原本是考察双关键字排序的,可是咱不会……就写了俩快排. program t1; type age=record year,mon:longint; end; var n,i,j:longint; a:array[1..100]of age; procedure sort(l,r:longint); var i,

&lt;泛&gt; 多路快排

今天写一个多路快排函数模板,与STL容器兼容的. 我们默认为升序排序 因为,STL容器均为逾尾容器,所以我们这里采用的参数也是逾尾的参数 一.二路快排 基本思路 给你一个序列,先选择一个数作为基数,我们要做的是把小于该基数的数字放于左侧,大于该基数的数字放于右侧,最后将此基数放于中间,形成新的序列,我们把左侧序列和右侧序列分别像之前那样做,最后得到的序列即为顺序序列. 过程演示 比如给你一个序列   4  3  1  5  4  7  9  1  8  0 我们采用双指针扫描法,红色代表左指针所

今天天气很好,写个快排练练手

最近有些懒,好久没写代码了,现在写个快排练练手吧. public class QucikSort { //此处交换两个数 public static void swap(int a[],int low,int high) { int temp=a[low]; a[low]=a[high]; a[high]=temp; } //分区,分成两部分 public static int partion(int a[],int low,int high) { swap(a,low,high); int c

自己写快排模板与C++快排库函数使用

自己写快排模板与C++快排库函数使用 1.自己写快排模板 我理解的快速排序思想原理是: 假定待排序数组的范围是0~N 1.在一个数组中找一个数作为中心点M(可以使用固定位置的数,也可以随机的采用数组中的数) 2.把数组中所有的数与这个中心点进行比较.小于中心点的数移到中心点左边,大于中心点的数移到中心点右边. 3.经过上面两步可以得到由M点所划分的两个数组(一个数组都小于等于M,一个都大于等于M),再对这两个数组递归的进行1.2所示步骤,知道划分的数组大小为0: 快排思想实现的主要的重点难点在于

排序之快排(JS)

快速排序(Quicksort)是对冒泡排序的一种改进. 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 详细描述:首先在要排序的序列 a 中选取一个中轴值,而后将序列分成两个部分,其中左边的部分 b 中的元素均小于或者等于 中轴值,右边的部分 c 的元素 均大于或者等于中轴值,而后通过递归调用快速排序的过程分别对两个部分进行排序

用python写个快排

快排过程比较简单就直接上代码了: 1 #!/usr/bin/python3 2 3 def quik_sort(L, left, right): 4 if left <= right: 5 key = L[left] 6 i = left 7 j = right 8 while i < j: 9 while i < j and key <= L[j]: 10 j -= 1 11 L[i] = L[j] 12 while i < j and L[i] <= key: 13

排序算法复习:直接插入排序、堆排序、快排、冒泡排序

冒泡排序,感觉是最简单的排序: 基本思路:每次把数组中最小的一个元素像气泡一样浮动.固定到最顶端: 从前向后遍历数组,每次拿到一个元素,就执行一遍冒泡: 从数组末尾开始,到当前元素截止,从后向前遍历,每次比较数组中相邻的两个元素,如果后者比较小,就把两者互换. 这样经过第一次冒泡,可以把最小的元素『浮』到数组的首位.第二次冒泡会把第二小的元素『浮』到数组的第二位.直到所有的元素都被『浮动』到正确的位置. 代码极其简单: var BubbleSort = function (array) { va

快排---快速排序

//快速排序 void quick_sort(int s[], int l, int r) { if (l < r) { //Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1 int i = l, j = r, x = s[l]; while (i < j) { while(i < j && s[j] >= x) // 从右向左找第一个小于x的数 j--; if(i < j) s[i++] = s[j]; wh