很早之前就看过快排quicksort,昨天真正想去写,看能不能写出,结果,折腾了很久硬是没写成功,一咬牙,果断看书上的例子,结果坑爹了,理论讲的非常high,代码以执行,啥都没有,上网找了一些,运气差到极点,全是错的,估计都没有验证。
为了节省大家的时间,不要像我一样为了它,折腾个半天,搞得很是恼火,共享一下。
void swap(int &a,int &b)
{
int temp = a;
a= b;
b = temp;
}
partition 函数:
int partition(int a[],int left,int right)
/*
eg:
int a[10] = {1,2,3,4,10,6,7,8,9,0};
quicksort(a,0,9);
*/
{
int i=left;
int j = right+1; //-----1
int temp = a[left];
while(true)
{ //第一个数 跳过
while(a[++i]<temp && i<right) ;
//因为 -----处已经加了1 所以不会少算
while(a[--j]>temp) ;
if(i>=j)
break;
swap(a[i],a[j]);
}
//最后交换 可用swap
a[left] = a[j];
a[j] = temp;
//无论最后一次的比较是i==j 还是i <j
//a[j] 都是小于temp 的且a[i] >temp
return j;
}
递归 快排下去
void quicksort(int a[],int left,int right)
{
if(left <right) //当只有一个数 即 left==right 时 不用排
{
int mid = partition(a,left,right);
quicksort(a,left,mid-1);
quicksort(a,mid+1,right);
}
}
主函数测试
int main()
{
// int a[9] = {1,2,3,4,10,6,7,8,9};
int a[20] = {1,2,3,4,10,6,7,8,
9,21,25,15,13,42,12,11,32,33,7};
quicksort(a,0,sizeof(a)/sizeof(a[0])-1);
for(int i=0;i<sizeof(a)/sizeof(a[0]);i++)
{
cout <<a[i] << " ";
}
cout <<endl;
return 0;
}
奇数个个数数据测试:
偶数个个数数据
第二个数据测试:
已经测试 边界安全,大家放心使用