快速排序(quick sort)

设待排序的表有10个元素,其关键字分别为(6,8,7,9,0,1,3,2,4,5)说明采用快速排序方法进行排序的过程。

快速排序(Quick Sort)的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

在这里插入图片描述

#include <stdio.h>
#define MAXL 100
typedef int KeyType;
typedef char InfoType;

typedef struct
{	KeyType key;
	InfoType data; 
}RecType;

void CreateList(RecType R[],KeyType keys[],int n)
//数组存放所有数据,KeyType保存单个数据,int n保存数据个数
{
	for(int i=0;i<n;i++)
		R[i].key=keys[i];
}

void DispList(RecType R[],int n) //Rec :record 记录 
{
	for(int i=0;i<n;i++)
		printf("%d ",R[i].key);
	printf("\n");
}

int partition(RecType R[],int s,int t)	//一趟划分
{
	int i=s,j=t;                //s:开始 t:结束的下标 
	RecType tmp=R[i];			//以R[i]为基准
	while (i<j)  				//从两端交替向中间扫描,直至i=j为止
	{	while (j>i && R[j].key>=tmp.key)
			j--;				//从右向左扫描,找一个小于tmp.key的R[j]
		R[i]=R[j];				//找到这样的R[j],放入R[i]处
		while (i<j && R[i].key<=tmp.key)//如果是>,则会数不出数据 
			i++;				//从左向右扫描,找一个大于tmp.key的R[i]
		R[j]=R[i];				//找到这样的R[i],放入R[j]处
	}
	R[i]=tmp;
	return i;
}
void QuickSort(RecType R[],int s,int t) //对R[s..t]的元素进行快速排序
{	int i;
	RecType tmp;
	if (s<t) 					//区间内至少存在两个元素的情况
	{	
		i=partition(R,s,t);     //得到基准
		printf("  i=%d: ",i);
		DispList(R,10); 
		QuickSort(R,s,i-1);		//对左区间递归排序
		QuickSort(R,i+1,t);		//对右区间递归排序
	}
}

int main()
{
	int i,n=10;
	RecType R[MAXL];
	KeyType a[]={6,8,7,9,0,1,3,2,4,5};
	CreateList(R,a,n);
	printf("排序前:"); DispList(R,n);
	QuickSort(R,0,n-1);
	printf("排序后:"); DispList(R,n);
	return 0;
}

1)第26、27行代码:
RecType tmp=R[i] 保存基准:6
int i=s,指向最开始元素:6
int j=t ,指向最后的元素:5

2)第28行代码:
i<j(0<9),从两端交替向中间扫描,直至i=j为止

3)第29、30行代码:
R[j].key(5)>R[i].key(6)不成立,
于是,R[i](5)=R[j](5)。

4)第33行代码
R[i].key(6)<=tmp.key(6),成立
i++(1);

一次循环结束:
5 8 7 9 0 1 3 2 4 5

4)第28行代码:
i<j(1<9),从两端交替向中间扫描,直至i=j为止

5)第32行代码:
R[i].key(8)<=tmp.key(6),不成立
于是,R[j](8)=R[i](8);

二次循环结束:
5 8 7 9 0 1 3 2 4 8
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值