排序大法(下)

快速排序

算法概述:分而治之(递归应用)、选主元、划分子列、cutoff阈值

代码如下:(未设阈值)

void swap(int* a,int* b)
{
   int tmp;
   tmp=*a;*a=*b;*b=tmp;
}
int median3(int A[],int left,int right)
{
    int center=(left+right)/2;
    if(A[left]>A[center]) 
       swap(&A[left],&A[center]);
    if(A[left]>A[right]) 
       swap(&A[left],&A[right]);
    if(A[center]>A[right]) 
       swap(&A[center],&A[right]);
    swap(&A[center],&A[right-1]);
    return A[right-1];
}

void Quicksort(int A[],int N,int left,int right)
{
   int i,j;
   if(right-left+1>=3){/*跳出条件*/
      int pivot=median3(A,left,right);
      i=left; j=right-1;
      for(;;){
          while(A[++i]<pivot){}
          while(A[--j]>pivot){}
          if(i<j) swap(&A[i],&A[j]);
          else break;
         }
       swap(&A[i],&A[right-1]);//i处为pivot应插入位置
       Quicksort(A,N,left,i-1);
       Quicksort(A,N,i+1,right); 
    } 
}
void Quick_Sort(int A[],int N)
{
    Quicksort(A,N,0,N-1);
}

在这里插入图片描述

基数排序:线性时间排序

LSD代码:

#define Radix 10
#define Digit 2
typedef struct Node* PtrN;
struct Node{
    int key;
    PtrN next;
};
struct HeadNode{//队列 
    PtrN head,tail;
};
typedef struct HeadNode Bucket[Radix];
int GetDigit(int X,int D)//X为待排元素,D为次位数 
{
    int d;
    for(int i=1;i<=D;i++){
    d=X%Radix;
    X=X/Radix;
 }
    return d;//得到D位下的待排元素 
}
void LSD_Sort(int A[],int N)
{
   Bucket B;
   for(int i=0;i<Radix;i++){//初始化桶 
      B[i].head=B[i].tail=NULL; }
   PtrN tmp,List=NULL;
   for(int i=0;i<N;i++){//将A[i]逆序存入List中 ,变成链表结点 
   tmp=(PtrN)malloc(sizeof(struct Node));
   tmp->key=A[i];
   tmp->next=List;
   List=tmp;
 }
 //排序
   for(int D=1;D<=Digit;D++){
   //p=List;/*为何要设p*/
      while(List!=NULL){
        int d=GetDigit(List->key,D);
        //tmp=p;p=p->next;
        tmp=List;List=List->next;
        tmp->next=NULL;//从List中摘除 
        if(B[d].head==NULL)       /*插入队列*/ 
           B[d].head=B[d].tail=tmp;
        else{
           B[d].tail->next=tmp;
           B[d].tail=tmp;}
       } 
      List=NULL;///? 
      for(int i=Radix-1;i>=0;i--){//用List装该次循环后得到的排序(准备下一次排序) 
         if(B[i].head!=NULL){
            B[i].tail->next=List;
            List=B[i].head;
            B[i].head=B[i].tail=NULL;}
       } 
   }
    for(int i=0;i<N;i++){
       PtrN tmp;
       tmp=List;
       List=tmp->next;
       A[i]=tmp->key;
       free(tmp); }
} 

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值