快速排序
算法概述:分而治之(递归应用)、选主元、划分子列、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); }
}