快速排序具体是什么可以参考其它文章了,是非常典型的分而治之思想的算法
下面说说快排的实现的方式,看注释
#include <stdio.h>
#include <stdlib.h>
void swap(int *a,int *b)
{
int tmp=*a;
*a=*b;
*b=tmp;
}
void QuickSorts(int *a,int left,int right,int &count)
{
if(left>right){ //如果左指针大于右指针,直接ret
return;
}
int l=left; //l 暂时记录左指针
int r=right; //r 暂时记录右指针
int privot=a[left]; //pivot当作中间值,取最左边的元素,然后就是大于pivot的放在数组右边,小于pivot放在左边
while(l<r) //进入循环
{
for(;r>l;--r) //如果r>l,--r
{
if(a[r]<privot) //if a[r]<privot
{
break;
}
}
for(;l<r;++l) //if 了<r ++l
{
if(a[l]>privot) //a[l]>privot
{
break;
}
}
if(l<r) //这里如果l<r就交换两个数字,这样大于privot的就在右边,小于privot的就在左边
{
swap(&a[l],&a[r]);
count++;
}
}
swap(&a[left],&a[l]); // 这一步是把privot放到确定的l的位置,也就是说privot最终的位置
QuickSorts(a,left,l-1,count); //递归的解决左半部分
QuickSorts(a,l+1,right,count); //递归的解决右半部分
}
void Quick(int *a,int len)
{
int count=0;
QuickSorts(a,0,len,count);
}
void PrintArray(int *a,int len)
{
for(int i=0;i<len;i++)
{
printf("%d->",a[i]);
}
printf("\n");
}
int main()
{
int a[]={1,456,789,12,0,12345,14,32,465,232}; //用于排序的数组
int len=sizeof(a)/sizeof(a[0]); //数组长度
Quick(a,len-1); //传进Quick里面套马甲,为啥是len-1,因为a[len]不存在元素
PrintArray(a,len);
}