(2)快速排序
***思想
从待排序记录序列中选取一个记录(通常选取第一个记录)为枢轴,其关键字设为K1,然后将其与关键字小于k1
的记录移到前面,而将关键字大于或等于k1的记录移到后面,结果将待排序记录序列分成两个子表,最后将关键字
为k1的记录插入到其分界线的位置处,这个过程称为一趟快速排序。通过一次划分后,就以关键字为k1的记录为界,
将待排序序列分成了两个子表,且前面子表中的所有记录的关键字均小于k1,而后面子表中的所有记录的关键字均
大于或等于k1。对分割后的子表继续按上述原则进行分割,直到所有子表的表长不超过1为止,此时待排序记录序列
就变成了一个有序表。
***算法
//一趟快速排序算法
int QKPass(RecordType r[],int low,int high)
{
x = r[low];
while(low<high)
{
while(low<high && r[high].key >= x.key)
{
high--;
}
if(low<high)
{
r[low] = r[high];
low++;
}
while(low<high && r[low].key < x.key)
{
low++;
}
if(low<high)
{
r[high] = r[low];
high--;
}
}
r[low] = x;
return low;
}
//完整的快速排序算法
void QKSort(RecordType r[],int low ,int high)
{
if(low<high)
{
pos = QKPass(r,low,high); //调用一趟快速排序,以枢轴元素为界划分两个子表
QKSort(r,low,pos-1); //对左部子表快速排序
QKSort(r,pos+1,high); //对右部子表快速排序
}
}
***案例
#include<stdio.h>
#include<stdlib.h>
typedef int KeyType;
typedef int OtherType;
typedef struct _RecordType
{
KeyType key;
OtherType other_data;
}RecordType;
void BubbleSort(RecordType r[],int n)
{
int i,j;
RecordType x;
for(i = 1;i<=n-1;i++)
{
for(j = 1;j<=n-i;j++)
{
if(r[j].key>r[j+1].key)
{
x = r[j];
r[j] = r[j+1];
r[j+1] = x;
}
}
}
}
int main()
{
int i;
int len;
RecordType r[20];
printf("请输入数组的长度:\n");
scanf("%d",&len);
for(i = 1;i<=len;i++)
{
printf("请输入数组中第%d个元素 ",i);
scanf("%d",&r[i].key);
}
printf("\n");
printf("排序之前的结果:\n");
for(i = 1;i<=len;i++)
{
printf("%d ",r[i].key);
}
printf("\n");
BubbleSort(r,len);
printf("排序之后的结果:\n");
for(i = 1;i<=len;i++)
{
printf("%d ",r[i].key);
}
printf("\n");
return 0;
}