zoukankan      html  css  js  c++  java
  • 快速排序

    一、快速排序

    核心思想:采用分治策略(divide and conquer)。

    基线条件是数组为空或者只包含一个数组,这种情况下,只需要原样返回数组,不用排序。

       if(len(array)<2)return array;

       quicksort(array);

    快排核心代码:

    void quicksort(int array[],int left,int right)
    {
        int i,j,temp;
        if(left<right)
        {
            i=left;
            j=right;
            temp=array[i];
            while(i<j)
            {
                while(i<j&&array[j]>temp)j--;
                if(i<j)array[i++]=array[j];
                while(i<j&&array[i]<temp)i++;
                if(i<j)array[j--]=array[i];
            }
            array[i]=temp;
            quicksort(array,left,i-1);//递归调用
            quicksort(array,i+1,right);
        }
    }
    //快速排序,QuickSort(array,left,right);
    if(left<right)
    {
        flag=partition(array,left,right);//分成两部分,一部分小于等于temp=array[0],一部分大于等于temp=array[0]
        quicksort(array,left,flag-1);//递归左边
        quicksort(array,flag+1,right);//递归右边
    }
    Partition(array,left,right)
    x=array[left]//选择第一个元素作为基准
    i=left-1
    int partition(int array[],int left,int right)
    {
        int temp=array[left]
        int i=left-1;j=left;
        for(j=left;j<right-1;j++)
        {
            if(array[j]<=temp)
            {
                i++;
                if(i!=j)
                swap(array[i],array[j]);
            }
        }
        swap(array[i+1],array[right]);
        return (i+1);
    }
    View Code

    具体实现:

    /*
        快速排序算法
    */
    #include<stdio.h>
    #include<stdlib.h>
    #define BUF_SIZE 100
    //打印方法
    void display(int array[],int maxlen)
    {
        int i;
        for(int i=0;i<maxlen;i++)
        {
            printf("%3d",array[i]);
        }
        return;
    }
    //交换方法
    void swap(int *a,int *b)
    {
        int temp;
        temp=*a;
        *a=*b;
        *b=temp;
        return;
    }
    //排序方法
    void quicksort(int array[],int maxlen,int begin,int end)
    {
        int i,j;
        if(begin<end)
        {
            j=begin+1;//将array[begin]作为基准数,因此从array[begin+1]开始与基准数无回比较
            j=end;
            while(i<j)
            {
                if(array[i]>array[begin])//如果比较的数组元素大于基准数,则交换位置
                {
                    swap(&array[i],&array[j]);//交换位置
                    j--;
                }
                else
                {
                    i++;//将数组向后移一位,继续与基准数比较
                }
                /*
                    跳出while循环后i=j
                    此时数组被分割成两个部分---->array[begin+1]~array[i-1]<array[begin]
                                        ----->array[i+1]~array[end]>array[begin]
                    这个时候将数组array分成两个部分,再将array[i]与array[begin]进行比较
                    决定array[i]的位置
                    最后将array[i]与array[begin]交换,进行连个分割部分的排序,
                    以此类推,知道最后i=j不满条件就跳出
                */
                if(array[i]>=array[begin])//这里必须要取等>=,否则数组元素相同的值,会出错
                {
                    i--;
                }
                swap(&array[begin],&array[i]);//交换array[i]与array[begin]
                quicksort(array,maxlen,begin,i);
                quicksort(array,maxlen,j,end);
            }
        }
    
    
    }
    View Code

     算法性能分析:

    平均情况
    快速排序的平均运行时间为θ(nlogn)。在有序的情况下,快速排序是θ(n^2),当存在相同的元素的时候,快排在进行比较的时候可能会导致原来元素顺序发生变化。所以它是不稳定的。
     

     二、随机快速排序

    1、划分函数的实现

    int RandomizedPartition(T a[],int p,int r)
    {
        int i=Random(p,r);
        swap(a[i],a[p]);
        return Partition(a,p,r);
    }

    2、随机快速排序算法的实现

    void RandomizedQuickSort(T a[],int p,int r)
    {
        if(p<r)
        {
            int q=RandomizedPartition(a,p,r);
            RandomizedQuickSort(a,p,q-1);//对左段排序
            RandomizedQuickSort(a,q+1,r);//对右段排序
        }
    }

    by author:Foredination

    2018-02-05 15:46:10

  • 相关阅读:
    ServiceStack在IIS7中发布后出现403.14错误
    ORACLE 误删除数据恢复
    Xamarin官方示例代码无法部署,提示已跳过部署解决方法
    安装完Oracle之后的注意事项
    在VS2013中使用水晶报表
    ArcObjects10.0MapControl不显示地图内容
    ArcObjects10.0引用控件报错
    ArcGIS Desktop10.2与CityEngine2012兼容问题
    mmo设计
    java nio 网络框架实现
  • 原文地址:https://www.cnblogs.com/drq1/p/8417906.html
Copyright © 2011-2022 走看看