快速排序

来源:互联网 发布:阿里云数据库被删除 编辑:程序博客网 时间:2024/06/09 17:34
     快速排序(Quicksort)是对冒泡排序的一种改进。     由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,     其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,     整个排序过程可以递归进行,以此达到整个数据变成有序序列。    function quickSort($arr){        $len = count($arr);        if($len <= 1) {            return $arr;        }        $key = $arr[0];        $left_arr    = array();        $right_arr    = array();        for($i=1; $i<$len; $i++){            if($arr[$i] <= $key){                $left_arr[] = $arr[$i];            } else {                $right_arr[] = $arr[$i];            }        }        $left_arr    = quickSort($left_arr);        $right_arr    = quickSort($right_arr);        return array_merge($left_arr, array($key), $right_arr);    }


对一组数进行排序(快速排序算法)。思路:通过一趟排序分成两部分,然后递归对这两部分排序,最后合并。function q($array) {    if (count($array) <= 1) {return $array;}    //以$key为界,分成两个子数组    $key = $array[0];    $l = array();    $r = array();    //分别进行递归排序,然后合成一个数组    for ($i=1; $i<count($array); $i++) {    if ($array[$i] <= $key) { $l[] = $array[$i]; }    else { $r[] = $array[$i]; }    }    $l = q($l);    $r = q($r);    return array_merge($l, array($key), $r);}$arr = array(1,2,44,3,4,33);print_r( q($arr) );

快速排序   (quicksort)— O(n log n)$data = array(6,13,21,99,18,2,25,33,19,84);dump($data);quicks($data,0,count($data)-1);dump($data);function dump( $data){echo '<pre>';print_r($data);echo '</pre>';}function QuickSort(& $arr,$left,$right){$l = $left;$r = $right;$pivot = intval(($r+$l)/2);$p = $arr[$pivot];do{   while(($arr[$l] < $p) && ($l < $right))    $l++;   while(($arr[$r] > $p) && ($r > $left))    $r--;   if($l <= $r)   {    $temp = $arr[$l];    $arr[$l] = $arr[$r];    $arr[$r] = $temp;    $l++;    $r--;   }}while($l <= $r);if($left < $r)   QuickSort(&$arr,$left,$r);if($l < $right)   QuickSort(&$arr,$l,$right);}

/*【快速排序(一 维数组)】【基本思想】:在当前无序区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各趟排序之后的状态*/function quick_sort($array){if (count($array) <= 1) return $array;$key = $array[0];$left_arr = array();$right_arr = array();for ($i=1; $i<count($array); $i++){    if ($array[$i] <= $key)      $left_arr[] = $array[$i];    else      $right_arr[] = $array[$i];}$left_arr = quick_sort($left_arr);$right_arr = quick_sort($right_arr);return array_merge($left_arr, array($key), $right_arr);}/*打印数组全部内容*/function display_arr($array){$len = count($array);for($i = 0; $i<$len; $i++){   echo $array[$i].' ';}echo '<br />';}


0 0
原创粉丝点击