标签:
(1)分解 (2)递归求解 (3)合并
int partition(int a[],int p,int r)
{
int i=p,j=r+1;
int x=a[p];
int temp;
while(1) //将<x的元素交换到左边元素,>x的元素交换到右边元素
{
while(a[++i]<x && i<r);
while(a[--j]>x);
if(i>=j)
break;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
a[p]=a[j];
a[j]=x;
return j;
}
void qSort(int a[],int p,int r,int num)
{
int i;
if(p<r)
{
int q=partition(a,p,r);
qSort(a,p,q-1,num); //对左半段排序
qSort(a,q+1,r,num); //对右半段排序
}
printf("快速排序过程:");
for(i=0;i<num;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
int main()
{
int num;
int i;
int a[100];
printf("请输入数组长度:");
scanf("%d",&num);
printf("请输入数组:\n");
for(i=0;i<num;i++)
{
scanf("%d",&a[i]);
}
qSort(a,0,num-1,num);
printf("快速排序结果:");
for(i=0;i<num;i++)
{
printf("%d ",a[i]);
}
return 0;
}
2.0归并排序算法
将两个有序的左右子表(以mid区分),合并成一个有序的表
void merge(int a[],int first,int mid,int last)
{
int indexA=first;
int indexB=mid+1;
int tempIndex=0;
int i;
static int temp[1000];
while(indexA<=mid && indexB<=last)//进行左右子表的遍历,如果其中有一个子表遍历完,则跳出循环
{
if(a[indexA]<a[indexB])
{
temp[tempIndex++]=a[indexA++];
}
else
{
temp[tempIndex++]=a[indexB++];
}
}
//有一侧子表遍历完后,跳出循环,将另外一侧子表剩下的数一次放入暂存数组中(有序)
while(indexA<=mid)
{
temp[tempIndex++]=a[indexA++];
}
while(indexB<=last)
{
temp[tempIndex++]=a[indexB++];
}
//将暂存数组中有序的数列写入目标数组的制定位置,使进行归并的数组段有序
tempIndex=0;
for(i=first;i<=last;i++)
{
a[i]=temp[tempIndex++];
}
}
void mergeSort(int a[],int first,int last,int num)
{
int i;
if(first<last)//子表的长度大于1,则进入下面的递归处理
{
int mid=(first+last)/2;
mergeSort(a,first,mid,num);
mergeSort(a,mid+1,first,num);
merge(a,first,mid,last);
}
printf("合并排序时的数组:\n");
for(i=0;i<num;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
int main()
{
int num;
int i;
int a[100];
printf("请输入数组长度:");
scanf("%d",&num);
printf("请输入数组:\n");
for(i=0;i<num;i++)
{
scanf("%d",&a[i]);
}
mergeSort(a,0,num-1,num);
printf("合并排序后的数组:\n");
for(i=0;i<num;i++)
{
printf("%d ",a[i]);
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/tandy/p/4910032.html