设待排序的表有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