排序算法
前提:分别用冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中的值按照从小到大的顺序进行排序。
$arr(1,43,54,62,21,66,32,78,36,76,39);
排序
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。
1. //冒泡
2. function BubbleSort($arr)
3. {
4. $len=count($arr);
5. //设置一个空数组 用来接收冒出来的泡
6. //该层循环控制 需要冒泡的轮数
7. for($i=1;$i<$len;$i++) 8. { //该层循环用来控制每轮 冒出一个数 需要比较的次数 9. for($k=0;$k<$len-$i;$k++) 10. { 11. if($arr[$k]>$arr[$k+1])
12. {
13. $tmp=$arr[$k+1];
14. $arr[$k+1]=$arr[$k];
15. $arr[$k]=$tmp;
16. }
17. }
18. }
19. return $arr;
20. }
21. echo ‘冒泡排序:’;
22. echo implode(‘ ‘,BubbleSort($arr)).”
“;
快速排序(Quicksort)是对冒泡排序的一种改进。
快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
1. function QSort($arr) {
2. //先判断是否需要继续进行
3. $length = count($arr);
4. if($length <= 1) { 5. return $arr; 6. } 7. //如果没有返回,说明数组内的元素个数 多余1个,需要排序 8. //选择一个标尺 9. //选择第一个元素 10. $base_num = $arr[0]; 11. //遍历 除了标尺外的所有元素,按照大小关系放入两个数组内 12. //初始化两个数组 13. $left_array = array();//小于标尺的 14. $right_array = array();//大于标尺的 15. for($i=1; $i<$length; $i++) { 16. if($base_num > $arr[$i]) {
17. //放入左边数组
18. $left_array[] = $arr[$i];
19. } else {
20. //放入右边
21. $right_array[] = $arr[$i];
22. }
23. }
24. //再分别对 左边 和 右边的数组进行相同的排序处理方式
25. //递归调用这个函数,并记录结果
26. $left_array = QSort($left_array);
27. $right_array = QSort($right_array);
28. //合并左边 标尺 右边
29. return array_merge($left_array, array($base_num), $right_array);
30. }
31. echo “快速排序:”;
32. echo implode(‘ ‘,QSort($arr)).”
“;
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
1. function SelectSort($arr) {
2. //实现思路 双重循环完成,外层控制轮数,当前的最小值。内层 控制的比较次数
3. //$i 当前最小值的位置, 需要参与比较的元素
4. for($i=0, $len=count($arr); $i<$len-1; $i++) { 5. //先假设最小的值的位置 6. $p = $i; 7. //$j 当前都需要和哪些元素比较,$i 后边的。 8. for($j=$i+1; $j<$len; $j++) { 9. //$arr[$p] 是 当前已知的最小值 10. if($arr[$p] > $arr[$j]) {
11. //比较,发现更小的,记录下最小值的位置;并且在下次比较时,
12. // 应该采用已知的最小值进行比较。
13. $p = $j;
14. }
15. }
16. //已经确定了当前的最小值的位置,保存到$p中。
17. //如果发现 最小值的位置与当前假设的位置$i不同,则位置互换即可
18. if($p != $i) {
19. $tmp = $arr[$p];
20. $arr[$p] = $arr[$i];
21. $arr[$i] = $tmp;
22. }
23. }
24. //返回最终结果
25. return $arr;
26. }
27. echo “选择排序:”;
28. echo implode(‘ ‘,SelectSort($arr)).”
“;
插入排序:有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
1. function InsertSort($arr) {
2. //区分 哪部分是已经排序好的
3. //哪部分是没有排序的
4. //找到其中一个需要排序的元素
5. //这个元素 就是从第二个元素开始,到最后一个元素都是这个需要排序的元素
6. //利用循环就可以标志出来
7. //i循环控制 每次需要插入的元素,一旦需要插入的元素控制好了,
8. //间接已经将数组分成了2部分,下标小于当前的(左边的),是排序好的序列
9. for($i=1, $len=count($arr); $i<$len; $i++) { 10. //获得当前需要比较的元素值。 11. $tmp = $arr[$i]; 12. //内层循环控制 比较 并 插入 13. for($j=$i-1;$j>=0;$j–) {
14. //$arr[$i];//需要插入的元素; $arr[$j];//需要比较的元素
15. if($tmp < $arr[$j]) { 16. //发现插入的元素要小,交换位置 17. //将后边的元素与前面的元素互换 18. $arr[$j+1] = $arr[$j]; 19. //将前面的数设置为 当前需要交换的数 20. $arr[$j] = $tmp; 21. } else { 22. //如果碰到不需要移动的元素 23. //由于是已经排序好是数组,则前面的就不需要再次比较了。 24. break; 25. } 26. } 27. } 28. //将这个元素 插入到已经排序好的序列内。 29. //返回 30. return $arr; 31. } 32. //var_dump(InsertSort($arr)); 33. echo '插入排序:'; 34. echo implode(' ',InsertSort($arr))."
“;
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。
http://blog.csdn.net/baidu_30000217/article/details/53309720
堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。
http://www.cnblogs.com/iampeter/p/3223487.html