• 技术文章 >后端开发 >php教程

    自学 PHP,冒泡排序和二元查找怎么也不明白,该放弃吗?

    2016-06-17 08:32:47原创661
    自学php,没有参加任何机构,自己看书学习。
    css div阶段都很通顺的学会了,正式学php 前两周也很通顺,语法,函数,很快就掌握了,但是到了数组就开始卡壳,数组以后几乎都听不懂了。
    泡沫排序我敲了20次程序,还是不知道那两个for循环是怎么想出来的。顺序查找和二元查找也完全没有学会。
    这个阶段怎么度过?
    我的努力程度几乎全天都在学习php,没有课的时候心无旁骛的敲当天学的代码,但就是敲不明白。
    我这个情况能顺利进入项目阶段吗?该放弃吗?

    回复内容:

    自然而然就会了,不用刻意理解 熟能生巧 不能从看或者写代码来理解算法,要理解算法然后再理解代码

    比如冒泡排序数组 $a,有 n 个元素
    首先你要能够理解一个冒泡排序,从头到尾,每一步都做了什么工作
    比如你能够用文字表达出来
    第一步:将 $a[0] 和 $a[1] 进行比较,如果 $a[0] > $[1] 则两个值互换
    第二步:将 $a[1] 和 $a[2] 进行比较,如果 $a[1] > $[2] 则两个值互换
    ...
    直到 $[n - 1] 和 $[n] 比较完毕
    这时候已经计算出最大值,并把它放在了 $a[n] 的位置上,但已经完成了一个循环,而 0 到 n - 1 之间的元素还是乱序的
    那接下来就是要从 0 到 n -1 之间算出最大值,并把它移动到 n - 1 的位置上,就是要重复最上面的每一步

    也就是说一个(内层)循环是为了遍历元素算出最大值,另一个(外层)循环是为了将整个步骤再计算一次

    最后,编程其实是一种难度跨度比较大的工作,也就是有的工作可能需要技术很强,但是有的工作也有可能难度低到没底线,所以如果不是没兴趣了,或者先天智商缺陷,坚持就好了。 这属于数据结构的部分,可以找些数据结构的书来看。

    可以看看维基百科上的“冒泡排序”条目: zh.wikipedia.org/wiki/% ,看一下C语言的那个程序,想一想两个for循环的4个数值是怎么得来的,为什么是i = 0; i < size - 1;和j = 0; j < size - i - 1;。还有flag变量是干嘛用的。

    维基百科页面下方还有很多其他排序算法的链接,可以一起看一看。

    jsdo.it/norahiko/oxIy/f 这里有用JavaScript写的各种排序的演示,把数量调到5,把速度调到1,慢慢地看一下整个排序过程是怎么进行的。 demo.sixpoint.me/sortin 这里是汉化版。
    css div阶段都很通顺的学会了,正式学php 前两周也很通顺,语法,函数,很快就掌握了,但是到了数组就开始卡壳,数组以后几乎都听不懂了。
    自学很赞成,现在的各种机构教出来的是什么样子大家都清楚。不过,什么叫“css div阶段”?HTML 4总共有多少标签?CSS 2.1总共有多少条规则?HTML是为了什么而设计出来的?CSS是为了什么而设计出来的?PHP语法本身很简单,和C基本一样。到数组就卡壳了,后面的一些结构怎么办?面向对象怎么办?
    以后做项目,可能有几百个对象和类,如果连个冒泡排序都理解不了,恐怕很难理清几百个对象之间的复杂关系。找一些图灵的书,虽然难一点,但是学出来后基础会比较扎实。 我当初学C的时候看谭浩强书上的那个冒泡排序,看了几十遍都没看明白实现的思路-,也是像lz这样怀疑的自己,想着要不要学下去,后面我都不知道从哪一天开始,突然就理解了..- -!
    我的建议是,看不懂的就暂时跳过,继续往后面学~可能看后面某个部分就自然明白了~ 个人愚见,刚开始的时候,我跟lz一样的,怎么都想不通.后来做的项目多了,接触的模块多了.再回头看算法,你就会如同猛然大悟一样的.原来你不知不觉已经运用了冒泡,递归,快速排序====之类的算法.
    但是,基础的数据结构概念你还是要多了解些的.
    加油! 冒泡排序是一种效率很低的排序算法,所谓的“泡”按我个人的理解就是数列中较大或较小的数,这个较大或较小的数不断的移动就是“冒”。

    各种排序算法,先弄清楚其原理,之后将其形象化(像放动画片一样),这样学起来就比较轻松了。这一切的前提是,你对算法有兴趣。

    下面是 Java 的冒泡算法:

    import java.util.*;
    
    public class Sorter {
    	
    	public static void main(String[] args) {
    		int[] arr = getIntArray(10, -50, 50);
    		
    		System.out.print("Before: ");
    		printArray(arr);
    		bubbleSort(arr);
    		System.out.print("After : ");
    		printArray(arr);
    	}
    	
    	private static int[] getIntArray(int capacity, int min, int max) {
    		Random random = new Random();
    		int[] arr = new int[capacity];
    		for (int i = 0; i < capacity; ++i) {
    			arr[i] = random.nextInt(max - min) + min;
    		}
    		return arr;
    	}
    	
    	private static void printArray(int[] arr) {
    		StringBuilder sb = new StringBuilder();
    		for (int i = 0; i < arr.length; ++i) {
    			sb.append(arr[i]).append(" ");
    		}
    		System.out.println(sb.toString());
    	}
    	
    	public static void bubbleSort(int[] arr) {
    		if (arr.length < 2) return;
    		boolean isSorted = false;
    		for (int i = arr.length - 1; i > 0 && !isSorted; --i) {
    			isSorted = true;
    			for (int j = 0; j < i; ++j) {
    				if (arr[j] > arr[j+1]) {
    					swap(arr, j, j+1);
    					isSorted = false;
    				}
    			}
    		}
    	}
    	
    	private static void swap(int[] arr, int indexA, int indexB) {
    		int temp = arr[indexA];
    		arr[indexA] = arr[indexB];
    		arr[indexB] = temp;
    	}
    }
    
    还是先学习c 吧 PHP多用于网站开发,你现在碰到的是算法问题,可以先绕道而行,不影响你对PHP的学习和使用 可以过一段时间再重复学习,跟练习哑铃差不多。
    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php for css div
    上一篇:PHP 程序员要不要学习 Linux shell 编程? 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 浅析PHP应用程序中正确调用系统命令的方法• 求解:phpcms模板怎样转码?该怎么解决• 想请问一下印证的有关问题• php 之 cookie 跟 session 简单解读(笔记) • xml转换成数组的有关问题
    1/1

    PHP中文网