#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//排序用到的结构和函数
#define MAXSIZE 20
typedef struct
{
int r[MAXSIZE+1]; //用于存储要排序的数组,r[0]用作哨兵或者临时变量
int length; //用于记录顺序表的长度
}SqList;
//交换L中数组r的下标为i和j的值
void swap(SqList * L,int i,int j)
{
int temp=L->r[i];
L->r[i]=L->r[j];
L->r[j]=temp;
}
//交换顺序表L中的子表的记录,是枢轴记录到位,并返回其所在位置
int Partition(SqList * L,int low,int high)
{
int pivotkey;
pivotkey=L->r[low]; //用子表的第一个记录作为枢轴的记录
while(low<high) //从表的两端交替向中间扫描
{
while(low<high && L->r[high]>=pivotkey)
high--;
swap(L,low,high); //将比枢轴记录小的记录交换到低端
while(low<high && L->r[low]<=pivotkey)
low++;
swap(L,low,high); //将比枢轴记录大的记录交换到高端
}
return low; //返回枢轴所在位置
}
//对顺序表L中的子序列L->r[low..high]做快速排序
void QSort(SqList * L,int low,int high)
{
int pivot;
if(low<high)
{
pivot=Partition(L,low,high); //将L->[low..high]一分为二
//算出枢轴值pivot
QSort(L,low,pivot-1); //对低子表递归排序
QSort(L,pivot+1,high); //对高子表递归排序
}
}
//快速排序
void QuickSort(SqList * L)
{
QSort(L,1,L->length);
}
//输出元素
void print(SqList * L)
{
for(int i=1;i<=L->length;i++)
{
printf("%d ",L->r[i]);
}
printf("\n");
}
int main()
{
int n;
SqList L;
L.length=0; //初始化length的长度
printf("请输入元素个数:\n");
scanf("%d",&n);
srand(0);
for(int i=1;i<=n;i++)
{
L.r[i]=rand()%100+1;
L.length++;
}
printf("排序前的数组: ");
print(&L);
QuickSort(&L);
printf("排序后的数组: ");
print(&L);
}
快速排序算法
最新推荐文章于 2021-07-22 16:38:04 发布