算法:快速排序

原理:

在一个数组中,选一个元素(通常是第一个元素或者数组的中间元素)与剩余的其它元素进行比较:建立两个分组(左组和右组),比当前元素小的放在左组,比当前元素大的放在右组。这样一来,将左组,中间组合右组合并起来就形成一个已经“排好序”的数组。实际上,左组和右组中的元素并不一定已经排好序,调用自己去排序,只有左右数组的元素个数大于1,就需要排序,如果元素个数等于一个,就不再调用函数。

使用递归实现(步骤):

1、实现从数组中取出一个元素:将小的放左边数组,大的放右边数组,最后返回合并结果

2、  左右两边数组有可能没有排好序:需要调用函数进行排序:函数本身就是为了给数组进行排序:调用自己解决自己的问题:递归

3、  递归开始:就必须找出递归出口:递归出口是数组的元素要小于等于1

<?php
//算法:快速排序

function quick_sort($arr)
{
    //在数组中取出第一个元素作为中间值
    $middle = $arr[0];
    //定义两个空数组
    $left = $right = array();
        //循环遍历,从第二个元素开始
        for($i=1,$len = count($arr);$i < $len;$i++)
        {
            //判断:比较中间值和数组中每一个元素
            if($middle > $arr[$i])
            {
                //比中间值
                $left[] = $arr[$i];
            }
            else
            {
                $right[] = $arr[$i];
            }
        }

//比较完之后,左数组和右数组不一定只有一个值,所以要对左右数组的长度进行判断,若长度大于1则需再次比较

    //判断左右数组的长度
    if(count($left)>1)
    {
        $left = quick_sort($left);
    }

    if(count($right)>1)
    {
        $right = quick_sort($right);
    }

    //合并数组左数组、中间值和右数组
    return array_merge($left,array($middle),$right);
}

//定义数组
$arr = array(6,72,65,76,5,2,83,9,23,0,68);

print_r(quick_sort($arr));

执行结果:

Array ( [0] => 0 [1] => 2 [2] => 5 [3] => 6 [4] => 9 [5] => 23 [6] => 65 [7] => 68 [8] => 72 [9] => 76 [10] => 83 )

时间: 2024-12-21 23:46:24

算法:快速排序的相关文章

编程算法 - 快速排序算法 代码(C)

快速排序算法 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 经典的快速排序算法, 作为一个编程者, 任何时候都要完整的手写. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h> #include <stdlib.h> int RandomInRange(int min,

Java算法快速排序

快速排序的原理:每次将序列以一个值为界限分成两组,在将两个序列分别以一个界限分成两组这样一直分下去. int[] a = {11,222,44,63,84,11,24,53,123,25,98,76,34}; 第一步:以34将数组a分成两组  11, 25, 24, 11              34,  63, 44, 53, 123, 222, 98, 76, 84 第二步:以11将11, 25, 24, 11分为两组  11, 11,     24, 25.以84将34,  63, 44

重点算法--快速排序

#include<iostream> using namespace std; ////写出快速排序,归并排序与堆排序 int adjustarray(int a[],int left,int right) { int x = a[left]; while(left < right) { while(a[right] > x && left < right) right--; ///注意这个小于的范围 if(left < right ) {a[left]

排序算法----快速排序java

快速排序是对冒泡排序的一种改进,平均时间复杂度是O(nlogn) import java.util.Arrays; import java.util.Scanner; public class test02{ public static void main(String[] args) { int n = 1; while (n != 0){ Scanner scanner = new Scanner(System.in); n = scanner.nextInt(); int s[] = ne

[数据结构和算法]快速排序笔记

特点:1.是冒泡的改进2.是一个递归的过程3.不稳定 4.时间复杂度:O(nlogn) 设要排序的数组是A[0]...A[n-1],首先取数组的第一个数作为关键数据,然后将所有比它小的数都放到它的前面,比他大的都放到他的后面,这个过程被称为一趟快速排序 算法步骤:1.设置两个变量i,j,排序开始i = 0, j = N-1;2.以第一个数组元素作为关键字,Key = A[0];3.从J开始向前搜索,即由后开始向前搜索j--, 找到第一个小于key的值A[j],将A[j]赋值给A[i]4.从I开始

经典排序算法 - 快速排序Quick sort

经典排序算法 - 快速排序Quick sort 原理,通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列 举个例子 如无序数组[6 2 4 1 5 9] a),先把第一项[6]取出来, 用[6]依次与其余项进行比较, 如果比[6]小就放[6]前边,2 4 1 5都比[6]小,所以全部放到[6]前边 如果比[6]大就放[6]后边,9比[6]大,放到[6

5.算法-快速排序

//算法-快速排序var cc=cc||consolefunction exchange(A,p1,p2){    if(p1!=p2){        var temp=A[p1]        A[p1]=A[p2]        A[p2]=temp    }}function quicksort(A,p,r){    if(p<r){        var q=partition(A,p,r)        quicksort(A,p,q-1)        quicksort(A,q+

算法---快速排序(quick sort)

在前面介绍的排序算法中,最快的排序算法为归并排序,但是归并排序有一个缺陷就是排序过程中需要O(N)的额外空间.本文介绍的快速排序算法时一种原地排序算法,所需的额外空间复杂度为O(1). 算法介绍:快速排序其实一种根据需找某个元素的具体位置进行排序的方法.比如所存在如下数组 选择第一个元素5,找到5最终的位置,即5的左边的数都小于或者等于5,右边的数都大于或者等于5. 从"6"开始,可知6大于5,此处停住,从"2"开始2小于5,因此交换6与2的位置,然后接着往下走,将

排序算法----快速排序(链表形式)

单链表形式实现排序算法. 这个快速排序主要利用递归调用.包含4个文件,头文件QuickSort.h,fatal.h,库函数QuickSort.c,测试文件TestQuickSort. QuickSort.h 1 typedef long ElementType; 2 #ifndef _List_H//如果没有编译过 3 #include<stdbool.h> 4 struct Node; 5 typedef struct Node *PtrToNode; 6 typedef PtrToNode

算法--快速排序(链表)

快速排序 http://m.blog.csdn.net/blog/u013071074/36867589 快速排序是由C. A. R. Hoare所发展的一种排序算法.其基本思想是基本思想是,通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序. 快速排序使用分治法来把一个串(list)分为两个子串行(sub-lists). 步骤为: 1.从数列中挑出一个元素,称为 "基准"(pivot), 2.