排序算法:快速排序法

快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都小于或等于基准值, 基准右边的元素值 都大于基准值。然后以基准数为界,分左和右两个子序列,递归调用,直至完成排序。

该方法的基本思想:一个未排序数组s[]

1.先从数列中取出一个数作为基准数(一般取第一个),保存到temp=s[l],此时第一个数组形成一个“坑”;

2.分区过程, i = l j = r

   (1)此时s[i]形成一个“坑”,从j向前遍历,直至找到一个s[j]<temp,则s[i]=s[j],i++

   (2)此时s[j]形成一个“坑”,从i向后遍历,直至找到一个s[i]>temp,则s[j]=s[i],j--

   (3)当j==i直接停止循环;

3.再对左右区间重复第二步,直到各区间只有一个数;

原始数据:初始值l = 0(基准数下标)  r = 7(最大下标)   temp = s[i] = 6(基准数值)

 0
 6  10  90  52  77 

第一次循环过程:

0
6

基准数:temp=s[0]=6

1,初始 i=l=0, j=r=7, 由j向后查找; 由于temp>s[7],则s[0]=s[7]=6,  (i++)-->1,  j=7;

0 1 2 3 4 5 6 7
3 10 4 90 52 77 8 3

2,i=1, j=7, 由i向前查找; 由于temp<s[1], 则s[7]=s[i]=10,  (j--)-->6, i=1;

0 1 2 3 4 5 6 7
3 10 4 90 52 77 8 10

3,i=1, j=6, 由j向后查找; 由于temp>s[2], 则s[1]=s[2]=4, (i++)-->2, j=2; 由于j==i,  停止循环,  s[i]=temp;

0 1 2 3 4 5 6 7
3 4 6 90 52 77 8 10

第一次结束后,从6将数组分成左右两个子数组,进行递归;

代码如下:

/**************************************************************************************
 *  Description:
 *   Input Args:
 *  Output Args:
 * Return Value:
 *************************************************************************************/
int quick_sort (int s[], int l, int r)
{
    if(l < r)
    {
        int i = l, j = r, temp = s[l];
        while (i < j)
        {
            while(i < j && s[j] >= temp) //小到大
                j--;
            if(i < j)
                s[i++] = s[j];    

            while(i < j && s[i] < temp)
                i++;
            if(i < j)
               s[j--] = s[i];
        }

        s[i] = temp;
        quick_sort(s, l, i - 1); //左子数组
        quick_sort(s, i + 1, r); //右子数组
    }

    return 0;
} /* ----- End of quick_sort()  ----- */

参考链接:http://blog.csdn.net/morewindows/article/details/6684558

时间: 2024-10-03 23:00:45

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

排序算法----快速排序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

经典排序算法 - 快速排序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

排序算法--快速排序

快速排序之所以特别快,主要是由于非常精炼和高度优化的内部循环. 像归并排序一样,快速排序也是一种分治的递归算法.数组S排序的基本算法由下列简单的四部组成: 1.如果S中元素个数是0或1,则返回 2.取S中任一元素v,称之为pivot(枢纽元,主元,基准) 3.将S-{v}分成两个不想交的集合:S1={x∈S-{v} | x <= v} 和 S2={x∈S-{v} | x > v} 4.返回{QuickSort(S1)后,继随v,继而QuickSort(S2) 为了完成上述的步骤3,有两种常用方

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

单链表形式实现排序算法. 这个快速排序主要利用递归调用.包含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

php 四种基础算法 ---- 快速排序法

4.快速排序法 代码: function quick_sort($arr) {    //先判断是否需要继续进行    $length = count($arr);    if($length <= 1) {        return $arr;    }    //如果没有返回,说明数组内的元素个数 多余1个,需要排序    //选择一个标尺    //选择第一个元素    $base_num = $arr[0];    //遍历 除了标尺外的所有元素,按照大小关系放入两个数组内    //

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

快速排序基本思想:挖坑填数+递归分治 快速排序使用分治法的策略,把一个串行分成2个子串行,快速排序又是一种分而治之的思想在排序算法是上的典型应用,本质上看,快速排序应该算冒泡排序基础上的递归分治法,快速排序名字简单粗暴,顾名思义就是快而且效率高,它是处理大数据最快的算法之一了. 算法描述:1.从数列中任意挑出一个数作为基准(pivot) 2.重新排序,所有比基准大的数放在基准左边,所有比基准大的数放在基准右边,这样排序一遍后该基准就位于数列的中间,这个就被称为分区操作(partition) 3.

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

一.快速排序的基本思想: 快速排序使用了分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小.之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的. 二.快速排序的三个步骤 1) 选择基准:在待排序列中,按照某种方式挑出一个元素,作为 "基准"(pivot): 2) 分割操作:以该基准在序列中的实际位置,把序列分成两个子序列.如果为升序,则此时,在基准左边的元素都比该基准小,在基准右边的元素都比基准大:而基准则在排序后正确的位置上.

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

快速排序是对冒泡法排序的一种改进. 快速排序算法 的基本思想是:将所要进行排序的数分为左右两个部分,其中一部分的所有数据都比另外一 部分的数据小,然后将所分得的两部分数据进行同样的划分,重复执行以上的划分操作,直 到所有要进行排序的数据变为有序为止. 可能仅根据基本思想对快速排序的认识并不深,接下来以对n个无序数列A[0], A[1]…, A[n-1]采用快速排序方法进行升序排列为例进行讲解. (1)定义两个变量low和high,将low.high分别设置为要进行排序的序列的起始元素和最后一个元

排序算法——快速排序

假如我从数组中挑出一个数(通常选为第一个数)<基准点>,那么我总可以利用这个数把数组分为两部分:大于这个数的部分和小于这个数的部分.然后对于这两个部分,分别重复前面的步骤,直到每一部分都只剩下2个数为止,我们可以比较出来.一看就知道是一个递归的程序,但是程序的难点在于:如何从用一个数把数组分为两个部分呢?当然.你大可以用一个比较笨的办法:搞一个临时数组,然后把比较的结果放在数组里,然后把数组在赋值给我们的数组.但是我这里用了一个比较巧妙地办法,通过一个临时变量,就解决了问题. 时间复杂度:O(

白话排序算法--快速排序

前言: 写到快速排序时,之前已经进行了冒泡.选择.插入排序,发现算法问题很多东西都是和实际问题相逆的,实际你可能会由外及里,由上及下,可是算法里面它有时就需要你由里往外去扩散,好比最里面的是小成果,然后一次次往外变化,成果也慢慢变大,最后直至达到最终成果为止.本篇快速排序方法因为调用了递归,你就可以逆着由里及外来思考问题. 写这篇文章光画图就花费了我2小时时间,越抽象就越不好形容和比喻,画的不好,希望各位不要吐槽. 快速排序:先快速排序将队列一分为二,然后对每个队列进行递归调用快速排序方法,直至