排序算法之快速排序

快速排序原理:

1.用最左侧元素作“枢轴”,存入“哨所”
2.设low和high指向两端
3.high向左移动,一旦遇到小于枢轴的元素,则将其移动到左侧,放入low指向的位置;
4.low向右移动,一旦遇到大于枢轴的元素,则将其移动到右侧,放入high指向的位置;
high和low从两侧交替向中间移动,直至low=high. 左侧均小于等于枢轴,右侧均大于等于枢轴,将枢轴记录填入重叠位置则完成划分

快速排序链表法的实现:

int Partition (SqList &L,int low,  int  high ) {
   L.r[0] = L.r[low]; 
   while( low < high ) {
      while( high > low && L.r[high] >= L.r[0])
                       --high;
      L.r[low] = L.r[high];
      while( low < high && L.r[low] <= L.r[0])  
                        ++low;
      L.r[high] = L.r[low];
   }
   L.r[low]=L.r[0]; 
   return low; //划分结束后返回枢轴位置
}
void QSort( SqList L, int low, int high){
     if( low<high ){
        pivotLoc=Partition(L,low,high);
        QSort(L, low , pivotLoc-1);//递归
        QSort(L, pivotLoc+1, high);//递归
    }
    else  //边界
         return;
}
该算法的平均复杂度:O(N*log2N) 最坏时间复杂度:O(N2),

平均空间复杂度:O(log2N),最坏空间复杂度:O(N)

静态数组的算法实现:

int Position(int a[],int low,int high)
{
    int t = a[low];
    while(low < high)
    {
       while(low<high && a[high]>=t)
          high--;
       a[low] = a[high];

       while(low<high && a[low]<=t)
          low++;
       a[high] = a[low];
    }

    //最终low=high
    a[low] = t;
    return low;
}
 void Quick_Sort(int a[],int low,int high)
{
    int pos;

    if(low < high)
    {
       pos = Position(a,low,high);
       Quick_Sort(a,low,pos-1);     //左边子序列排序
       Quick_Sort(a,pos+1,high);    //右边子序列排序
    }
}

另外需要注意,快速排序算法是不稳定的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值