就一个快速排序的算法。。。。(感谢师兄的帮助)
主要思路:
选定一个基准值,将数组分成两部分,比基准值小的在左边,大的在右边。。。
代码:
//主函数
void sort(int *a,int low,int high)
{
if(low < high)
{
int m=part(a,low,high);
sort(a,low,m-1); //m之前的那部分进行排序
sort(a,m+1,high); //m之后的那部分进行排序
}
}
//分区部分
int part(int *a,int low,int high)
{
while(low<high) //相遇时跳出
{
while(low<high && a[low]<=a[high]) //下标high从右端开始向左递减,直到两下标相遇
{ //或者a[high]的值小于a[low]的值
--high;
}
swap(a[low],a[high]); //交换两个值
while(low<high && a[low]<=a[high]) //交换完成后下标low从左往右递增,直到两下标相遇
{ //或者a[low]的值大于a[high]的值
++low;
}
swap(a[low],a[high]); //交换两个值
}
return low; //返回基准值移动后的下标
}
分区部分的示意图:
下面再补上一个非递归实现的:
void sort(int *a,int low,int high)
{
if(low < high)
{
int i=low,j=high;
while(i<j)
{
while(i<j && a[i]<=a[j])
{
--j;
}
swap(a[i],a[j]);
while(i<j && a[i]<=a[j])
{
++i;
}
swap(a[i],a[j]);
}
sort(a,low,i-1);
sort(a,i+1,high);
}
}
调用过程:
int main()
{
int a[]={2,158,65,51,41,345,415,15,415,41654,4,46,1,56,4,84,5,4154,5,4,84,5,4,98,48,74,89,9,8,9,8,2,5,89,54,54,6,4864,684,64,64,8,48,486,49,98,658,4,845,89,4896,4,74,89,4586,4,68,48,64,9,654,4,484};
sort(a,0,sizeof(a)/sizeof(a[0])-1);
copy(a,a+sizeof(a)/sizeof(a[0]),ostream_iterator<int>(cout," "));
}
运行截图:
(注:那个时间不准的,无视它吧)