快速排序
基本思想:通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录进行排序,以达到整个序列有序
排序过程:对r[s……t]中记录进行一趟快速排序,附设两个指针low和high,设枢轴记录rp=r[s],x=rp.key
初始时令low=s,high=t
首先从high所指位置向前搜索第一个关键字小于x的记录,并和rp交换
再从low所指位置起向后搜索,找到第一个关键字大于x的记录,和rp交换
重复上述两步,直至low==high为止
再分别对两个子序列进行快速排序,直到每个子序列只含有一个记录为止
快速排序程序:
#include<stdio.h>
#define SIZE 200
typedef struct{
int key;
int next;
}SLNOde;
typedef struct{
SLNOde r[SIZE];
int length;
}Sqlist;
int Patition(Sqlist &L,int low,int high)
{
int pi;
L.r[0]=L.r[low];
pi=L.r[low].key;
while(low<high)
{
while(low<high&&L.r[high].key>=pi)
--high;
L.r[low].key=L.r[high].key;
while(low<high&&L.r[low].key<=pi)
++low;
L.r[high].key=L.r[low].key;
}
L.r[low].key=L.r[0].key;
return low;
}
void Qsort(Sqlist &L,int low,int high)
{
int pi;
if(low<high)
{
pi=Patition(L,low, high);
Qsort(L, low,pi-1);
Qsort(L, pi+1,high);
}
}
void Quicksort(Sqlist &L)
{
Qsort(L, 1,L.length);
}
void main()
{
int i;
Sqlist L;
printf("请输入待排序的总长度:\n");
scanf("%d",&L.length);
printf("请输入%d个数:\n",L.length);
for(i=1;i<=L.length;i++)
{
scanf("%d",&L.r[i].key);
}
Quicksort(L);
printf("输出快速排序后的序列:\n");
for(i=1;i<=L.length;i++)
{
printf(" %d",L.r[i].key);
}
printf("\n");
}