//左边区间比key小,中间区间未处理,右边区间比key大
int oneSort(int a[],int left,int right)
{
//i,j为两个指针,一个从左向右移动,一个从右向左移动
int i=left;
int j=right;
int key=a[left]; //把第一个数当轴值
while(i<j)//每次循环处理左右两个子区间,并完成左右区间第一个不满足值的位置交换
{
while(key<a[j]&&i<j) //如果右边的值比轴值大,指针向左移动
j--;
if(i<j)
{
a[i]=a[j];//右边第一个比key小的值放在左边指针停留的位置
i++;//左边指针向右移动一位,下次指针移动从下一个位置开始
}
while(a[i]<key&&i<j) //如果左边的值比轴值小,指针向右移动
i++;
if(i<j)
{
a[j]=a[i];//左边第一个比key大的值放在右边指针停留的位置
j--;//右边指针向左移动一位,下次指针移动从下一个位置开始
}
}
//至此,[left,i]左边区间值都比key小,[j,right]右边区间值都比key大,完成时i==j
a[i]=key; //设置key的位置,i指针停留的位置就是key的位置,实际上就是交换key,i,j的值
//key=a[j];右边第一个比key小的值放在key位置
//a[j]=a[i];左边第一个比key大的值放在右边第一个比key小的位置
//a[i]=key;key放在左边第一个比key大的位置
return i; //返回key的位置
}
void qSort(int a[],int left,int right)
{
if(left<right)
{
int key_pos=oneSort(a,left,right); //完成一次划分,并返回key的坐标
qSort(a,left,key_pos-1);//继续划分左边
qSort(a,key_pos+1,right);//继续划分右边
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[10] = {7,3,8,9,4,1,10,5,2,6};
cout<<"before sort:";
for (int i=0;i<10;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
qSort(a,0,9);
cout<<"after sort:";
for (int i=0;i<10;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
getchar();
return 0;
}
C/C++快速排序
原创shixin_0125 ©著作权
©著作权归作者所有:来自51CTO博客作者shixin_0125的原创作品,请联系作者获取转载授权,否则将追究法律责任

提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
【C】排序算法
文章介绍了几种常用的排序,包括其实现思路与具体代码实现。
排序 算法 代码分析 -
C++快速排序
讲述了使用C++对快速排序算法的使用
数组 数据 快速排序 -
C++实现快速排序
快速排序的递归和非递归写法、优化
数据结构 排序 快速排序 -
C++排序算法之快速排序
C++排序算法之快速排序!
算法 c++ 快速排序 i++ 递归 -
快速排序之C++实现
在递归的过程中,每层递归都需要保存一些临时变量,包括基准元素的索引、左右指针的位置等,这些变量占用的空间与递归
c++ java 算法 快速排序 数组