美文网首页今日看点
从快速排序法看好的算法需要的思维意识

从快速排序法看好的算法需要的思维意识

作者: 那未必 | 来源:发表于2015-12-26 18:24 被阅读329次

** 人脑趋向于将问题扁平化,这样思考问题时的认知负荷小。这就是我们常说的清清楚楚。**
如果你习惯沿着让人脑舒适的路线来设计算法,你就无法最大限度的发挥电脑的特长,让电脑高效的解决问题。比如,递归。要把递归过程中的每个环节想清楚,对于人脑来说是存在巨大的认知负荷的。人脑的运行内存是很小的,偏偏递归是一种内存开销大的编程模式。

今天尝试用js来实现快速排序法(虽然js的Array已经自带有排序函数,但是为了训练思维,还是动手去体会了一下个中的各种坑)。网上有一篇文章,用漫画的形式非常清楚的解说了快速排序法的原理。看完原理之后,原本以为自己动手可以很轻松的写出这个算法来。然而现实并不是那么一回事。

坑一

从漫画看明白了,快速排序法通过递归的方式一遍遍将数组切割成左右两个部分,然后通过相同的方式进行换位操作。但是在写代码时,我却下意识的希望一开始就将排序过程中那些出现的“子数组”在一开始就计算出来。但是,实际上这是不可能的,“子数组”是在一遍遍递归过程中生成的。所以,还是扁平化思维在作祟,否则,这是显而易见的问题。

坑二

我没有接受过C语言编程的训练,所以对指针的理解很粗浅,更缺乏感性认识。在快速排序法中,一开始我试图用for循环来实现指针偏移,但是实际上这里的逻辑决定了一开始你并不知道循环的长度有多少。所以,合理的应该是使用while循环来实现。另外,循环语句执行的结果是什么?一开始,下意识会认为是确定要进行换位的数(元素)——即结果(这又是一种扁平化思维的影响),但是实际上更为合理的方法应该是确定指针的位置,有了指针无论如何你都可以根据它去得到你想要的东西。

代码

最后将实现代码记录一下:

var arr=[213, 35, 2, 700, 277, 21, 486, 17, 919, 615];
fsort(arr,0,arr.length-1);

function fsort(arr,left,right){
    var i,j,t,temp;
    if(left>right){
        /*console.log('complete');
        console.log(arr);*/
        return;
    }

    console.log(arr.slice(left,right+1))

    i=left;
    j=right;
    temp=arr[left];//基准数

    while(i!=j){
        while(arr[j]>=temp && i<j)j--;
        while(arr[i]<=temp && i<j)i++;
        if(i<j){
            t=arr[i];
            arr[i]=arr[j];
            arr[j]=t;
        }
    }

    arr[left]=arr[i];
    arr[i]=temp;

    fsort(arr,left,i-1);
    fsort(arr,i+1,right);

}

反思

就像前些天写将思维简图的录入数据结构化的算法一样,算法首要确定的是元素之间的关系。在这个例子中,“关系”即“指针”;在思维简图的例子中,“关系”则是那些自己创造的描述节点关系的字段值。先瞄准计算出这些内容,才能帮你更好的发挥电脑的能力,也让编程更加灵活。

相关文章

  • 从快速排序法看好的算法需要的思维意识

    ** 人脑趋向于将问题扁平化,这样思考问题时的认知负荷小。这就是我们常说的清清楚楚。**如果你习惯沿着让人脑舒适的...

  • iOS常见算法

    升序算法:用冒泡排序法 选择排序法 快速排序

  • 排序算法

    排序算法分类 排序算法常用主要有:冒泡排序法、快速排序法、选择排序法、插入排序法、堆排序法、归并排序法等几种。 ...

  • 《python算法教程》Day9 - 快速排序法

    这是《python算法教程》第9篇读书笔记,笔记的主要内容为快速排序法。 快速排序法简介 快速排序法运用分治法的方...

  • PHP常见排序算法学习

    题记: 常见的排序算法有:冒泡排序法,快速排序法,选择排序法,插入排序法,此处作为自己最近面试准备进行的学习笔记,...

  • sort快排的实现

    快速排序的基本实现 快速排序算法是一种基于交换的高效的排序算法,它采用了分治法的思想:1、从数列中取出一个数作为基...

  • 程序员都应该知道的 10 大算法

    算法一:快速排序法 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(n log ...

  • 算法应该怎么 “玩”?程序员都应该知道的 10 大算法

    算法一:快速排序法 快速排序是由东尼 · 霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log...

  • 06-快速排序(完成)

    快速排序(高效排序算法) —— 不稳点!!! 动态图: 一、概念: 原理:  快速排序使用分治法(Divide a...

  • 《算法图解》NOTE 4 快速排序法

    这是《算法图解》的第四篇读书笔记,主要涉及快速排序法。 1.递归与分治法 快速排序法(quick sort)之所以...

网友评论

    本文标题:从快速排序法看好的算法需要的思维意识

    本文链接:https://www.haomeiwen.com/subject/mylbhttx.html