当年读书的时候没好好学习,以至于对经典算法的掌握实在是不敢恭维...
直到出来工作了,才慢慢的重拾起它们。
递归,冒泡排序法都比较好理解,唯独快速排序法(二分法),理解起来总觉得有点绕...
故记之,方便日后直接拿来用。
//快速排序函数参数说明: //Arr 需要排序的数组 //left 需要排序数组的左界(也就是0) //right 需要排序数组的右界(也就是 Arr.lenght - 1) var quickSort = function(Arr, left, right){ var p; //用来存入每次对比整理过之后,基准元素的所在位置(下标) if(left < right){ p = partition(Arr, left, right); quickSort(Arr, left, p - 1); quickSort(Arr, p + 1, right); }; }; var partition = function(Arr, left, right){ var lm, //左标记 rm, //右标记 pivot, //用来存入基准元素 t; //用来缓存需要呼唤位置的两个元素的其中一个 pivot = Arr[left]; lm = left - 1; rm = right + 1; /* 下面这段逻辑的思想是: 分别从数组的最左端和最右端开始,与基准元素做对比,左标记和右标记分别记住左右两端参与对比的数的下标 当左端的数小于或等于基准元素,那么它的位置不用改变,左标记右移一位(+1) 当右端的数大于基准元素,那么它的位置不用改变,右标记左移一位(+1) 当左标记指向的数大于基准元素,右标记指向的数小于或等于基准元素,那么左标记和右标记指向的数进行位置互换 循环执行上面的逻辑,直到左标记和右标记相遇(它们的差为1) 此时左标记所在的位置起往左的数全部都小于或等于基准元素,将基准元素与左标记指向的元素互换位置 然后得到的数组就符合 基准元素左边的所有元素都小于或等于基准元素,右边的所有元素都大于基准元素 的规则 数字被成功分类成两部分 最后,返回调整位置后基准元素所在的位置(下标) */ while(lm + 1 != rm) { if(Arr[lm+1] <= pivot){ lm++; }else if(Arr[rm-1] > pivot){ rm--; }else{ t=Arr[lm+1]; Arr[++lm]=Arr[rm-1]; Arr[--rm]=t; } } Arr[left] = Arr[lm]; Arr[lm] = pivot; return lm; }