快排思想:把一个数的集合根据集合中的中间位置的数a的大小划分为两部分,比a小的数都移到它的左边,比a大的数都移到它的右边,然后再根据同样方法用递归对新划分的两个集合进行快速排序。
实现代码如下:
/***********************************************************************
Copyright (c) 2015,wangzp
All rights no reserved.
Name: 递归实现快排
问题描述:用递归实现快排
算法思想: 把一个数的集合划分成两个子集,用其中的一个数字作为比较对象,把比它小的数全部
移到它的左边,比它大的数全部移到它的右边,然后再次对新的两个集合进行快速排序递归调用。
Date: Sep 09, 2015
***********************************************************************/
#include"stdio.h"
void qsort(int v[],int left,int right)
{
int i,last;
void swap(int v[],int i,int j);//注意这种方式,可以把swap函数定义在qsort之前
if (left >= right)//递归结束的标志
{
return;
}
swap(v,left,(left + right)/2);//取中间元素作为分界点,并把分界点元素移到v[0]方便比
较
last = left;
for (i = left + 1;i <= right;i++)
{
if (v[i] < v[left])
{
swap(v,++last,i);//把比分界点元素小的数都移到它的左边
}
}
swap(v,left,last);//再把分界点元素恢复
/*递归调用排序算法*/
qsort(v,left,last -1);
qsort(v,last + 1,right);
}
void swap(int v[],int i,int j)
{
int temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}
int main(void)
{
int a[] = {7,9,5,6,2,10,15,5,7,4,1,3,11};
qsort(a,0,(sizeof(a)/sizeof(int) - 1));//注意调用时,数组从0到大小-1
int i;
for (i = 0;i < sizeof(a)/sizeof(int);i++)
{
printf("%d ",a[i]);
}
printf("\n");
//输出结果:1 2 3 4 5 5 6 7 7 9 10 11 15
return 0;
}