快速排序算法

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void inputarr(int*, int);
void showdata(int*, int);
void quick(int*,int, int,int);
int process=0;
int main(void)
{
	int size, data[100]={0};
	srand((unsigned)time(NULL));
	printf("请输入数组大小(100 以下):");
	//scanf("号d", &size);
    size = 10;
	printf("您输入的原始数据是:");
	inputarr (data,size);
	showdata (data,size);
	quick(data,size,0,9);
	printf("\n 最终的排序结果为:");
	showdata(data,size);
	system("pause");
	return 0;
}
void inputarr(int data[], int size)
{
	int i;
	for (i=0;i<size;i++)
	    data[i]=(rand()%99)+1;
}

void showdata(int data[],int size)
{
	int i;
	for (i=0;i<size;i++)
		printf("%3d",data[i]);
	printf("\n");
}
void quick(int d[],int size,int lf,int rg)
{
	int i, j, tmp;
	int lf_idx;
	int rg_idx;
	int t;
	if(lf<rg) /*1:第一个键值为 d[lf]*/
	//step2 :
	{
		lf_idx=lf+1;
		rg_idx=rg;
step2:
		printf("[排序过程号%d]=>",process++);
		for(t=0;t<size;t++)
			printf("[%2d]",d[t]);
		printf("\n");
		for(i=lf+1;i<=rg;i++) /*2:从左向右找出一个键值大于 d[lf]者*/
		{
			if(d[i]>=d[lf])
			{
				lf_idx=i;
				break;
			}
			lf_idx++;
		}
		for(j=rg;j>=lf+1;j--) /*3:从右向左找出一个键值小于 d[lf]者*/
		{
			if (d[j]<=d[lf])
			{
				rg_idx=j;
				break;
			}
			rg_idx--;
		}
		if(lf_idx<rg_idx) /*4-1:若lf idx<rg idx*//*则 d[lf idx]和 d[rg idx]互换*/
		{
			tmp = d[lf_idx];
			d[lf_idx]= d[rg_idx];
			d[rg_idx]= tmp;
			goto step2; /*4-2:并继续执行步骤2*/
		}
		
		if(lf_idx>=rg_idx)/*5-1:若 lf idx 大于等于 rg idx*/
		{   /*则将 d[lf]和 d[rg idx]互换*/
			tmp = d[lf];
			d[lf]= d[rg_idx];
			d[rg_idx]= tmp;
			/*5-2:并以 rg idx 为基准点分成左右两部分*/
			/*以递归方式分别为左右两部分进行排序*/
			quick(d, size, lf, rg_idx-1);
			quick(d, size, rg_idx+1, rg);/*直至完成排序*/
		}
	}
}

参考文档:

快速排序详解-优快云博客

快速排序(Quick sort)-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值