快速排序
快速排序是一种常用的有效的排序方式。核心思想是分治法。
算法
1、划分
通过交换将一个子数组分成三个部分,分别为左部,中间标识元素和右部,并且保证左部不大于标识元素,右部大于标识元素。如图:
p1 | p2 | p3 | … | pn | i | k1 | k2 | … | kn |
---|
其中: 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");
}