/*快速排序
原理:随机选择一个数select,将比select小的放左边,比select大的放右边,
利用递归进行对较小的和较大的部分分别进行这个过程
*/
int j,k;
#include<stdio.h>
#include<time.h>
#include <stdlib.h>
void swap(int a[],int i,int l)//用于数字交换位置
{
int t;
t=a[i];
a[i]=a[l];
a[l]=t;
}
void partition(int a[],int left,int right)//将数组分为3部分,小于,等于,大于
{
j=left-1;k=right;//j为小于区,k为大于区
while(left<k)
{
if(a[left]<a[right])//小于区+1 向前移动一位
{
swap(a,++j,left++);
}
else if(a[left]>a[right])//大于区+1 比较交换过来的数字(不需要向前移动)
{
swap(a,--k,left);
}
else//向前移动一位
left++;
}
swap(a,k,right);
j=j+1;
}
void quicksort(int a[],int left,int right)
{
int q,p;
if(left<right)//判断是否终止
{
srand(1);//随机生成数字
swap(a,left+rand()%(right-left+1),right);//随机选择一个数字作为判断标准
partition(a,left,right);
quicksort(a,left,j-1);//j-1为小于区
quicksort(a,k+1,right);//k+1为大于区
}
}
int main()
{
int i=0,n;
int a[100];
scanf("%d",&n);
for(i=0;i<=n-1;i++)
{
scanf("%d",&a[i]);
}
quicksort(a,0,n-1);
for(i=0;i<=n-1;i++)
{
printf("%d ",a[i]);
}
}
随机快排
最新推荐文章于 2021-12-25 14:29:50 发布