- <?php
- $un_sort_array=array();
- for($i=0;$i<20;$i++)
- {
- $un_sort_array[]=rand(1,9999);
- }
- //用于二分查找
- $need_value = end($un_sort_array);
- /* 插入排序
- 【基本思想】:每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,使数列依然有序;直到待排序数据元素全部插入完为止。
- 【示例】: [初始关键字]
- [49] 38 65 97 76 13 27 49
- J=2(38) [38 49] 65 97 76 13 27 49
- J=3(65) [38 49 65] 97 76 13 27 49
- J=4(97) [38 49 65 97] 76 13 27 49
- J=5(76) [38 49 65 76 97] 13 27 49
- J=6(13) [13 38 49 65 76 97] 27 49
- J=7(27) [13 27 38 49 65 76 97] 49
- J=8(49) [13 27 38 49 49 65 76 97]
- */
- function insert($un_sort_array)
- {
- //$i待移动的元素
- for($i=1;$i<count($un_sort_array);$i++)
- {
- $value = $un_sort_array[$i];
- //$j被插入队列的索引
- $j=$i-1;
- while($value && $value < $un_sort_array[$j])
- {
- $un_sort_array[$j+1]=$un_sort_array[$j];
- $j--;
- if($j<0)
- break;
- }
- $un_sort_array[$j+1]= $value;
- }
- return $un_sort_array;
- }
- /*
- 【选择排序(一维数组)】【基本思想】:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。【示例】:
- [初始关键字] [49 38 65 97 76 13 27 49]
- 第一趟排序后 13 [38 65 97 76 49 27 49]
- 第二趟排序后 13 27 [65 97 76 49 38 49]
- 第三趟排序后 13 27 38 [97 76 49 65 49]
- 第四趟排序后 13 27 38 49 [49 97 65 76]
- 第五趟排序后 13 27 38 49 49 [97 97 76]
- 第六趟排序后 13 27 38 49 49 76 [76 97]
- 第七趟排序后 13 27 38 49 49 76 76 [ 97]
- 最后排序结果 13 27 38 49 49 76 76 97 */
- function select_sort($un_sort_array)
- {
- for($i=0;$i<count($un_sort_array)-1;$i++)
- {
- $min_index = $i;
- $value = $un_sort_array[$i];
- for($j=$i+1;$j<count($un_sort_array);$j++)
- {
- if($un_sort_array[$j]<$un_sort_array[$i])
- {
- $un_sort_array[$i] = $un_sort_array[$j];
- $min_index = $j;
- }
- }
- $un_sort_array[$min_index] = $value;
- }
- return $un_sort_array;
- }
- //select_sort($un_sort_array);
- /*
- 【冒泡排序】【基本思想】:两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。【排序过程】:设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上"漂浮",如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。*/
- function ball_sort($un_sort_array)
- {
- for($i=0;$i<count($un_sort_array)-1;$i++)
- {
- //$value = $un_sort_array[$i];
- for($j = count($un_sort_array)-1;$j>$i;$j--)
- {
- if($un_sort_array[$j] < $un_sort_array[$j-1])
- {
- $value = $un_sort_array[$j];
- $un_sort_array[$j]= $un_sort_array[$j-1];
- $un_sort_array[$j-1] = $value;
- }
- }
- }
- return $un_sort_array;
- }
- //print_r(ball_sort($un_sort_array));
- /*
- 【快速排序(一维数组)】【基本思想】:在当前无序区R[1..H]中任取一个数据元素作为比较的"基准"(不妨记为X),用此基准将当前无序区划分为左右两个较小的无序区:R[1..I-1]和R[I 1..H],且左边的无序子区中数据元素均小于等于基准元素,右边的无序子区中数据元素均大于等于基准元素,而基准X则位于最终排序的位置上,即R[1..I-1]≤X.Key≤R[I 1..H](1≤I≤H),当R[1..I-1]和R[I 1..H]均非空时,分别对它们进行上述的划分过程,直至所有无序子区中的数据元素均已排序为止。
- 【示例】:
- 初始关键字 [49 38 65 97 76 13 27 49]
- 第一次交换后 [27 38 65 97 76 13 49 49]
- 第二次交换后 [27 38 49 97 76 13 65 49]
- J向左扫描,位置不变,第三次交换后 [27 38 13 97 76 49 65 49]
- I向右扫描,位置不变,第四次交换后 [27 38 13 49 76 97 65 49]
- J向左扫描 [27 38 13 49 76 97 65 49](一次划分过程)
- 初始关键字 [49 38 65 97 76 13 27 49]一趟排序之后 [27 38 13] 49 [76 97 65 49]
- 二趟排序之后 [13] 27 [38] 49 [49 65]76 [97]
- 三趟排序之后 13 27 38 49 49 [65]76 97
- 最后的排序结果 13 27 38 49 49 65 76 97 各趟排序之后的状态 */
- //$start 为开始索引,$end为结束索引
- function quick_sort($un_sort_array,$start,$end)
- {
- $value = $un_sort_array[$start];
- $i=$start+1;
- $j=$end;
- while(1)
- {
- while( $un_sort_array[$i]<$value && $i<$j)
- $i++;
- //多一个=号是因为交换的时候,关键字要和小于关键字的部分交换
- while( $un_sort_array[$j]>$value && $i<=$j)
- $j--;
- if($i>=$j)
- break;
- $tmp = $un_sort_array[$i];
- $un_sort_array[$i] = $un_sort_array[$j];
- $un_sort_array[$j] = $tmp;
- //print_r($un_sort_array);exit;
- }
- $un_sort_array[$start] = $un_sort_array[$j];
- $un_sort_array[$j] = $value;
- if( ($j-1-$start) >0)
- quick_sort($un_sort_array,$start,$j-1);
- if( ($end-$j-1) >0 )
- quick_sort($un_sort_array,$j+1,$end);
- }
- quick_sort($un_sort_array,0,19);
- //print_r($un_sort_array);
- //利用一维数组 递归二分查找法
- //将数组$un_sort_array排序后,为升序
- function binary_seach($un_sort_array,$start,$end,$need_value)
- {
- $mid = intval(($start+$end)/2);
- if($start>$end )
- {
- //未找到或者参数出错
- return false;
- }
- if($need_value>$un_sort_array[$mid])
- {
- return binary_seach($un_sort_array,$mid+1,$end,$need_value);
- }
- else if($need_value<$un_sort_array[$mid])
- {
- return binary_seach($un_sort_array,$start,$mid-1,$need_value);
- }
- else
- {
- return true;
- }
- }
- //var_dump(binary_seach($un_sort_array,0,19,$need_value));
- //二分查找(递归消除)
- function binary_seach_clean($un_sort_array,$start,$end, $need_value)
- {
- while($start <= $end )
- {
- $mid = intval( ($start+$end)/2 );
- if ($un_sort_array[$mid] == $need_value)
- return true;
- elseif ($need_value < $un_sort_array[$mid])
- {
- $end = $mid - 1;
- }
- else
- {
- $start = $mid + 1;
- }
- }
- return false;
- }
- var_dump(binary_seach_clean($un_sort_array,0,19,$need_value));
最近辞职了 准备早点回家过年,待着实在无聊 就写了一些原来数据结构的算法的应用。