您的位置:首页 > 其它

排序算法------快速排序

2013-01-05 11:45 211 查看
#include<stdio.h>
#include<stdlib.h>

#define Status int
#define  max 20
typedef struct {
Status key;
}ElemType;
typedef struct {
ElemType  r[max];
int length;
}Sqlist;
void  Inital(Sqlist &L)   //初始化
{
L.r[1].key=49;
L.r[2].key=38;
L.r[3].key=65;
L.r[4].key=97;
L.r[5].key=76;
L.r[6].key=13;
L.r[7].key=27;
L.r[8].key=49;
L.length=8;
}
bool LT(int i,int j)
{
if(i<j)
return true;
else return false;
}
int Partition(Sqlist &l,int low ,int high)   //一趟排序(将原有序列分为两部分)
{
int pivotkey;
l.r[0]=l.r[low];
pivotkey=l.r[low].key;      //记录关键字
while(low<high)
{
while(low<high&&l.r[high].key>=pivotkey) --high;   //从序列的右端起找到第一个比关键字小的记录
l.r[low]=l.r[high];        //将这个小的记录放在之前低位
while(low<high&&l.r[low].key<=pivotkey) ++low;  //从序列的左端起找到第一个比关键字大的记录
l.r[high]=l.r[low];//将这个大的记录放在之前的位置上
}
l.r[low]=l.r[0]; //找到关键字正确的所在位置
return low;     //返回关键字位置
}
void QSort(Sqlist &l,int low,int high)   //快速排序函数
{
int pivotkey;
if(low<high){
pivotkey =Partition(l,low,high);//找到关键字正确位置
QSort(l,low,pivotkey-1);  //依照关键字位置将原序列分为两部分,在递归,分治
QSort(l,pivotkey+1,high);
}
}
void QuickSort(Sqlist &l)    //快速排序函数
{
QSort(l,1,l.length);
}
void print(Sqlist l)
{
int i;
printf("排序后的结果为:");
for(i=1;i<=l.length;i++)
{
printf("%d  ",l.r[i].key);
}
}
void main()
{
Sqlist l;
Inital(l);
QuickSort(l);
print(l);
getchar();
getchar();
}
//算法分析:1.时间复杂度为O(nlogn)
//2.当原纪录无序时跟其他方法中,快速排序是最好的一种
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: