快速排序

快速排序

快速排序是一种常用的有效的排序方式。核心思想是分治法。

算法

1、划分

通过交换将一个子数组分成三个部分,分别为左部,中间标识元素和右部,并且保证左部不大于标识元素,右部大于标识元素。如图:

p1p2p3pnik1k2kn

其中: A[pn]<=A[i]< A[kn]

具体做法:
设子数组在数组中的位置为p到r,即A[p]到A[r]为要划分的子数组,另i等于p-1,中间标识元素x取A[r],并试图用p到i表示左部,i+1到j表示右部,j+1到r-1为待定部分,即:
i=p-1
x=A[r]
j=p
初始时,左部和右部不存在,只有待定部分,然后依次扫描子数组(p~r-1),如果当前元素A[j]小于等于标识元素x,则将该元素移动到左部,i=i+1。扫描结束后将标识元素置换到右部的第一个位置。
最后,返回标识元素的位置

2、排序

设待排序的数组为A【p~r】
1、如果子数组长度大于1,执行步骤2,否则结束程序
2、对子数组进行划分,得到两个子数组
3、分别对步骤2产生的两个子数组执行步骤1

3、代码

#include<stdio.h>
void exchange(int *p1,int *p2)//交换两个值n
{
    int temp;
    temp=*p1;
    *p1=*p2;
    *p2=temp;
}
int partition(int *a,int p,int r)//对数组进行划分
{
    int temp,i,j,x;
    x=a[r];
    i=p-1;
    for(j=p;j<r;j++)
    {
        if(a[j]<=x)//将小于x的元素置换到数组j位置之前(包括j )
        {
            i++;
            exchange(&a[i],&a[j]);
        }
    }
    exchange(&a[r],&a[i+1]);
    return i+1;//返回中间值
}
void quicksort(int *a,int p,int r)
{
    int q;

    if(p<r)
    {
        q=partition(a,p,r);
        quicksort(a,p,q-1);
        quicksort(a,q+1,r);
    }

}
int main()
{
    int i;
    int a[11]={7,9,4,8,5,6,1,55,7,12,3};
    quicksort(a,0,10);//排序
    for(i=0;i<=10;i++)
        printf("%d ",a[i]);
    printf("\n");

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值