include”stdio.h”
void QuickSort(int *v, int left ,int right);
void swap (int *s, int i,int j);
void main()
{
int i;
int s[] = {32,20,65,10,70};
for(i=0;i<=4;i++)
{
printf(“%d ..”,s[i]);
}
printf(“\n”);
// swap(s,2,3);
QuickSort(s,0,4);
for(i=0;i<=4;i++)
{
printf("%d..",s[i]);
}
}
void QuickSort(int *v, int left ,int right)
{
int pivot; //用于记录中间zhi
int cnt;// bian li
if(left>=right) //这里必须要有这一步不然总是跳不出去
return;
pivot = (left+right)/2;
swap(v,left,pivot); //注意left的值并不会改变
for(cnt=left+1;cnt<=right;cnt++)
{
if(v[cnt]<v[pivot])
swap(v,++pivot,cnt);//这里不能用left 他是个保留值
}
swap(v,left,pivot);
//以下代码是递归调用
QuickSort(v, left ,pivot-1);
QuickSort(v, pivot+1 ,right);
}
//这个函数完成数组中的两个的交换
void swap(int *s, int i,int j)
{
int temp;
temp = s[i];
s[i] = s[j];
s[j] = temp;
}
代码的原理
快速排序也是分治法思想的一种实现,他的思路是使数组中的每个元素与基准值(Pivot,通常是数组的首个值,A[0])比较,数组中比基准值小的放在基准值的左边,形成左部;大的放在右边,形成右部;接下来将左部和右部分别递归地执行上面的过程:选基准值,小的放在左边,大的放在右边。。。直到排序结束。
步骤:
1.找基准值,设Pivot = a[0]
2.分区(Partition):比基准值小的放左边,大的放右边,基准值(Pivot)放左部与右部的之间。
3.进行左部(a[0] - a[pivot-1])的递归,以及右部(a[pivot+1] - a[n-1])的递归,重复上述步骤。
以下代码是其核心代码
void QuickSort(int *v, int left ,int right)
{
int pivot; //用于记录中间zhi
int cnt;// bian li
if(left>=right) //这里必须要有这一步不然总是跳不出去
return;//上面这两句是保证递归调用的时候能有出去的时候
pivot = (left+right)/2;//这里是保存期中间的值
swap(v,left,pivot); //注意left的值并不会改变
for(cnt=left+1;cnt<=right;cnt++)
{
if(v[cnt]<v[pivot])
swap(v,++pivot,cnt);//这里不能用left 他是个保留值
}
}