经典排序算法 - 快速排序

先定义一下结构体:

 #define MAXSIZE 20
 typedef struct{
    int key;     //关键字项
    InfoType otherinfo;   //其他数据项
 }RedType;
 typedef struct{
    RedType r[MAXSIZE+1];    //r[0]闲置或用作哨兵单元
    int length;        //顺序表长度
 }SqList;

快速排序的基本思想是,通过一趟排序将记录分割成两个独立的部分,其中一部分的记录的关键字均比另一部分记录的关键字都小,再分别对这两部分记录继续进行排序,以达到整个序列有序。
先写个交换函数:

 void swap(SqList &L, int low, int high){
     RedType temp;
     temp = L.r[low];
     L.r[low] = L.r[high];
     L.r[high] = temp;
 }

无哨兵,即不记录枢轴关键字的单次快排:

 int Partition(SqList &L, int low, int high){
      int pivotkey = L.r[low].key;
      while(low<high){
           while(low<high&&L.r[high].key>=pivotkey)      --high;
           swap(L,low,high);
           while(low<high&&L.r[low].key<=pivotkey)      ++low;
           swap(L,low,high);
    }
    return low;    //return high;都可以,low=high
 }

有哨兵,使用子表的第一个记录作枢轴记录(即r[0])的单次快排:

 int Partition(SqList &L, int low, int high){
      L.r[0] = L.r[low];
      int 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 pivotloc;
   if(low<high){
      pivotloc = Partition(L, low, high);
      QSort(L, low, pivotloc-1);
      QSort(L, pivotloc+1, high);
   }
}

此种快速排序还是挺灵活的,可以随意对记录中任何一段进行排序。
完善中。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值