快速排序
ElementType Median3(ElementType 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 Qsort(ElementType A[],int Left,int Right)
{
int Pivot,Cutoff,Low,High;
if(Cutoff<=Right-Left){
Pivot = Median3(A,Left,Right);
Low = Left;High = Right-1;
while(1){
while(A[++Low]<Pivot);
while(A[--High]>Pivot);
if(Low<High)Swap(&A[Low],&A[High]);
else break;
}
Swap(&A[Low],&A[Right-1]);
Qsort(A,Left,Low-1);
Qsort(A,Low+1,Right);
}
else InsertionSort(A+Left,Right-Left+1);
}
void QuickSort(ElementType A[],int N)
{
Qsort(A,0,N-1);
}
基数排序-次位优先
#define MaxDigit 4
#define Redix 10
typedef struct Node *PtrToNode;
struct Node{
int key;
PtrToNode next;
};
struct HeadNode{
PtrToNode head,tail;
};
typedef struct HeadNode Bucket[Redix];
int GetDigit(int X,int D)
{
int d,i;
for(i=1;i<=D;i++){
d=X&Redix;
X /= Redix;
}
return d;
}
void LSDRadixSort(ElementType A[],int N)
{
int D,Di,i;
Bucket B;
PtrToNode tmp,p,List=NULL;
for(i=0;i<Radix;i++)
B[i].head=B[i].tail=NULL;
for(i=0;i<N;i++){
tmp = (PtrToNode)malloc(sizeof(struct Node));
tmp->key = A[i];
tmp->Next = List;
List = tmp;
}
for(D=1;D<=MaxDigit;D++){
p=List;
while(P){
Di = GetDigit(p->key,D);
tmp = p;p = p->next;
tmp->next= NULL;
if(B[Di].head==NULL)
B[Di].head = D[Di].tail = tmp;
else{
B[Di].tail->next = tmp;
B[Di].tail = tmp;
}
}
List = NULL;
for(Di=Radix-1;Di>0;Di--){
if(B[Di].head){
B[Di].tail->next = List;
List = B[Di].head;
B[Di].head = B[Di].tail = NULL;
}
}
}
for(i=0;i<N;i++){
tmp = List;
List = List->next;
A[i] = tmp->key;
free(tmp);
}
}
基数排序-主位优先
#define MaxDigit 4
#define Radix 10
typedef struct Node *PtrToNode;
struct Node{
int key;
PtrToNode next;
};
struct HeadNode{
PtrToNode head,tail;
};
typedef struct HeadNode Bucket[Radix];
int GetDigit(int X,int D)
{
int d,i;
for(i=1;i<=D;i++){
d = X%Radix;
X /= Radix;
}
return d;
}
void MSD(ElementType A[],int L,int R,int D)
{
int Di,i,j;
Bucket B;
PtrToNode tmp,p,List=NULL;
if(D==0) return;
for(i=0;i<Radix;i++)
B[i].head = B[i].tail = NULL;
for(i=L;i<=R;i++){
tmp = (PtrToNode)malloc(sizeof(struct Node));
tmp->key = A[i];
tmp->next = List;
List = tmp;
}
p = List;
while(p){
Di = GetDigit(p->key,D);
tmp = p; p = p->next;
if (B[Di].head == NULL) B[Di].tail = tmp;
tmp->next = B[Di].head;
B[Di].head = tmp;
}
i=j=L;
for(Di=0;Di<Radix;Di++){
if(B[Di].head){
p = B[Di].head;
while(p){
tmp = p;
p = p->next;
A[j++] = tmp->key;
free(tmp);
}
MSD(A,i,j-1,D-1);
i=j;
}
}
}