快速排序中的分割函数:选取一个枢轴数,再以这个枢轴数为基准,将比枢轴数小的数移动到左边,比枢轴数大的数移动到右边(若是升序排序)。其中,最初提取枢轴数这一步有人用一个很形象的词语来描述:挖坑。
//快速排序:分割
//选取最后一个数为枢轴数,
//然后从左向右扫描
#include<iostream>
using namespace std;
int Partition(int arr[],int low,int high);
int main()
{
const int length=8;
int arr[length]={49,38,65,97,76,13,27,49};
cout<<"The position of privot is : "
<<Partition(arr,0,length-1)<<endl
<<"After partition :"<<endl;
for(int i=0;i<length;i++)
cout<<arr[i]<<' ';
return 0;
}
int Partition(int arr[],int low,int high)
{ /* 从左向右扫描 */
//隐含条件:j能够走动这一步,说明之前的数
//都不是(小于枢轴的数),也即能被替换
const int pivotkey=arr[high];
int i=low-1,j=low;
for(;j<high;j++)
{
if(arr[j]<pivotkey)
{
int tmp=arr[++i];
arr[i]=arr[j];
arr[j]=tmp;
}
}
int tmp=arr[i+1];
arr[i+1]=arr[high];
arr[high]=tmp;
return i+1;
}
//快速排序:分割
//选取第一个数为枢轴数
//然后从两端向中间交替扫描
#include<iostream>
using namespace std;
int Partition(int arr[],int low,int high);
int main()
{
const int length=8;
int arr[length]={49,38,65,97,76,13,27,49};
cout<<"The position of privot is : "
<<Partition(arr,0,length-1)<<endl;
return 0;
}
int Partition(int arr[],int low,int high)
{
/* 将第一个关键字作为枢轴关键字 */
const int pivotkey=arr[low];
while(low< high)
{ /* 从表的两端交替地向中间扫描 */
while(low<high&&arr[high]>=pivotkey)
--high;
arr[low]=arr[high]; //将比枢轴记录小的记录移到低端
while(low<high&&arr[low]<=pivotkey)
++low;
arr[high]=arr[low]; //将比枢轴记录大的记录移到高端
}
arr[low]=pivotkey; //枢轴关键字到位
return low;
}
可以看出,后一种较前一种充分利用了“挖坑”的特性:不用再使用临时变量交换两个变量的值。后一种是
<<《数据结构》算法实现及解析_高一凡编著>>中实现的,不过在这里,简化了例如结构体和类型别名的部分,更好理解吧。