C语言数据结构 快速排序 源码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Quick Sort 程序已就绪,可直接编译运行
#include
#include
#include
#define OK 1
#define TRUE 1
#define ERROR 0
#define FALSE 0
#define OVERFLOW -2
#define MAXSIZE 100
typedef int Status;
typedef int KeyType; //定义关键字类型为整数型typedef int InfoType;
typedef struct
{
KeyType key; //关键字项
InfoType info; //其他记录项
}RedType; //记录类型
typedef struct
{
RedType r[MAXSIZE+1]; //r[0]闲置或用作哨兵单元
int length; //顺序表长度
}SqList; //顺序表类型
int Partition(SqList &L,int low,int high)
{//交换顺序表L中子表L.r[low..high]的记录,使枢轴记录到位,并返回其所在位置
//此时在它之前(后)的记录均不大(小)于它。
KeyType pivotkey;
L.r[0]=L.r[low]; //用子表的第一个记录作枢轴记录
pivotkey=L.r[low].key; //枢轴记录关键字
while(low { while(low L.r[low]=L.r[high]; //将比枢轴记录小的记录移到低端 while(low L.r[high]=L.r[low]; //将比枢轴记录大的记录移到高端 } L.r[low]=L.r[0]; //枢轴记录到位 //count++; return low; //返回枢轴位置 } void QSort(SqList &L,int low,int high,int &count) {//对顺序表L中的子序列L.r[low..high]作快速排序 int pivotloc,i; if(low { pivotloc=Partition(L,low,high); //将L.r[low..high]一分为二 count++; //记录划分次数 QSort(L,low,pivotloc-1,count); //对低子表递归排序,pivotloc是枢轴位置 QSort(L,pivotloc+1,high,count); //对高子表递归排序} //count++; } void QuickSort(SqList &L,int &count) {//对顺序表L作快速排序 QSort(L,1,L.length,count); } int main() { int i,len,again,count=0; SqList L; printf("即将进行快速排序\n\n请输入将要排序的数字个数:"); scanf("%d",&len); L.length=len; printf("\n\n请输入数字序列,以空格间隔,回车结束:"); for(i=1;i<=len;i++) scanf("%d",&L.r[i].key); QuickSort(L,count); printf("\n\n有序序列为:"); for(i=1;i<=len;i++) printf("%d ",L.r[i].key); printf("\n\n一共进行了%d次划分",count); printf("\n\n本组排序已结束,希望再进行新的一组排序吗?(0:否1:是):"); scanf("%d",&again); if(again) { printf("\n\n"); return main(); } else if(!again) return 0; }