• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Foreordination
酒后高歌磨剑,梦中快意恩仇,名利脚下踩,情义两肩挑
博客园    首页    新随笔    联系   管理    订阅  订阅
快速排序

一、快速排序

核心思想:采用分治策略(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

 

posted on 2018-02-05 15:47  Foreordination  阅读(150)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3