插入排序 :直接插入 折半插入 2-路插入 表插入排序 希尔排序
#include<stdio.h>
#define EQ(a,b) ( (a)==(b) )
#define LT(a,b) ( (a)< (b) )
#define LQ(a,b) ( (a)> (b) )
#define MAXSIZE 20
typedef int KeyType;
typedef struct {
}InfoType;
typedef struct {
KeyType key;
InfoType otherinfo;
}RedType;
typedef struct {
RedType r[MAXSIZE];
int length;
}SqList;
void InsertSort(SqList &L){
int i, j;
for(i=2;i<=L.length;i++)
if(LT(L.r[i].key, L.r[i-1].key)){
L.r[0] = L.r[i];
L.r[i] = L.r[i-1];
for(j=i-2; LT(L.r[0].key, L.r[j].key); --j)
L.r[j+1] = L.r[j];
L.r[j+1] = L.r[0];
}
}
void BInsertSort(SqList &L){
int i, j, low, high, mid;
for(i=2;i<=L.length;i++){
L.r[0] = L.r[i];
low = 1; high = i-1;
while (low<=high){
mid = (low +high)/2;
if(LT(L.r[0].key, L.r[mid].key)) high -= 1;
else low += 1;
}
for(j=i-1;j>=high+1;j--) L.r[j+1] = L.r[j];
L.r[high+1] = L.r[0];
}
}
void TInsertSort(SqList &L){
int d[L.length+2], first=L.length+1, final=1, m ,n;
d[first] = d[final] = L.r[1].key;
for(int i=2;i<=L.length;i++){
if (LT(L.r[i].key,d[1])){
n = first-1;
while (LQ(L.r[i].key, d[first])){
d[first-1] = d[first];
first++;
}
d[first-1] = L.r[i].key;
first = n;
}else{
m = final+1;
while ( LT(L.r[i].key, d[final])){
d[final+1] = d[final];
final--;
}
d[final+1] = L.r[i].key;
final = m;
}
}
int k=1;
for(int i=first;i<=L.length;i++) L.r[k++].key = d[i];
for(int i=1;i<=final;i++) L.r[k++].key = d[i];
}
#define SIZE 100
#define MAXINT 9999
typedef struct {
KeyType key;
InfoType otherinfo;
}RcdType;
typedef struct {
RcdType rc;
int next;
}SLNode;
typedef struct {
SLNode r[SIZE];
int length;
}SLinkListType;
void SInsertSort(SLinkListType &SL){
SL.r[0].rc.key = MAXINT; SL.r[0].next = 1; SL.r[1].next = 0;
SL.length = 8;
printf("Init(%d):\n",SL.length);
for(int i=1;i<=SL.length;i++) scanf("%d",&SL.r[i].rc.key);
for(int i=2;i<=SL.length;i++){
int pos = 0;
while (SL.r[SL.r[pos].next].rc.key!=MAXINT && SL.r[i].rc.key>=SL.r[SL.r[pos].next].rc.key) pos = SL.r[pos].next;
SL.r[i].next = SL.r[pos].next;
SL.r[pos].next = i;
}
}
void Print(SLinkListType SL){
int p = SL.r[0].next;
while (SL.r[p].rc.key!=MAXINT){
printf("%d ",SL.r[p].rc.key);
p = SL.r[p].next;
}
printf("\n");
}
void Arrange(SLinkListType &SL){
int p = SL.r[0].next, q;
for(int i=1;i<SL.length;i++){
while (p<i) p = SL.r[p].next;
q = SL.r[p].next;
if(p!=i){
int temp = SL.r[i].rc.key;
SL.r[i].rc.key = SL.r[p].rc.key;
SL.r[p].rc.key = temp;
SL.r[p].next = SL.r[i].next;
SL.r[i].next = p;
}
p = q;
}
}
void Print_(SLinkListType SL){
for(int i=1;i<=SL.length;i++) printf("%d ",SL.r[i].rc.key);
printf("\n");
}
void ShellInsert(SqList &L, int dk){
int i, j;
for(i=1+dk; i<=L.length; ++i)
if(LT(L.r[i].key, L.r[i-dk].key)){
L.r[0] = L.r[i];
for(j=i-dk; j>0&<(L.r[0].key , L.r[j].key); j -= dk) L.r[j+dk] = L.r[j];
L.r[j+dk] = L.r[0];
}
}
void ShellSort(SqList &L, int dlta[], int t){
for(int k=0;k<t;k++) ShellInsert(L, dlta[k]);
}
void CinList(SqList &L, int n){
L.length = n;
printf("Init(%d):\n",n);
for(int i=1;i<=n;i++) scanf("%d",&L.r[i].key);
}
void Print(SqList L){
printf("Out:\n");
for(int i=1;i<=L.length;i++) printf("%d ",L.r[i].key);
printf("\n");
}
int main(){
SqList L;
CinList(L, 8);
int dlta[] = {9,5,3,2,1};
ShellSort(L,dlta,5);
Print(L);
return 1;
}
快速排序 :冒泡排序 快速排序
#include<stdio.h>
#define EQ(a,b) ( (a)==(b) )
#define LT(a,b) ( (a)< (b) )
#define LQ(a,b) ( (a)> (b) )
#define MAXSIZE 20
typedef int KeyType;
typedef struct {
}InfoType;
typedef struct {
KeyType key;
InfoType otherinfo;
}RedType;
typedef struct {
RedType r[MAXSIZE];
int length;
}SqList;
void BubbleSort(SqList &L){
for(int i=1;i<L.length;i++)
for(int j=1;j<=L.length-i;j++)
if(LQ(L.r[j].key, L.r[j+1].key)){
int temp = L.r[j].key;
L.r[j].key = L.r[j+1].key;
L.r[j+1].key = temp;
}
}
int Partition(SqList &L, int low, int high){
L.r[0] = L.r[low];
KeyType pivoteky = L.r[low].key;
while(low<high){
while ( L.r[high].key>=pivoteky && low<high ) high--;
L.r[low] = L.r[high];
while ( L.r[low].key<=pivoteky && low<high ) 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){
int pivotloc = Partition(L,low,high);
QSort(L,low,pivotloc-1);
QSort(L,pivotloc+1,high);
}
}
void QuickSort(SqList &L){
QSort(L,1,L.length);
}
void CinList(SqList &L, int n){
L.length = n;
printf("Init(%d):\n",n);
for(int i=1;i<=n;i++) scanf("%d",&L.r[i].key);
}
void Print(SqList L){
printf("Out:\n");
for(int i=1;i<=L.length;i++) printf("%d ",L.r[i].key);
printf("\n");
}
int main(){
SqList L;
CinList(L, 8);
QuickSort(L);
Print(L);
return 1;
}
选择排序 :简单选择排序 堆排序
#include<stdio.h>
#define EQ(a,b) ( (a)==(b) )
#define LT(a,b) ( (a)< (b) )
#define LQ(a,b) ( (a)> (b) )
#define MAXSIZE 20
typedef int KeyType;
typedef struct {
}InfoType;
typedef struct {
KeyType key;
InfoType otherinfo;
}RedType;
typedef struct {
RedType r[MAXSIZE];
int length;
}SqList;
int SelectMinKey(SqList L, int i){
int min = L.r[i].key, pos = i;
for(int j=i+1;j<=L.length;j++)
if(L.r[j].key<min){
min = L.r[j].key;
pos = j;
}
return pos;
}
void SelectSort(SqList &L){
int i, j;
RedType temp;
for(i=1;i<L.length;i++){
j = SelectMinKey(L, i);
if(i!=j){
temp = L.r[i];
L.r[i] = L.r[j];
L.r[j] = temp;
}
}
}
typedef SqList HeapType;
void HeapAdjust(HeapType &H, int s, int m){
RedType rc = H.r[s];
int j;
for( j=2*s; j<=m; j*=2){
if(j<m && LT(H.r[j].key, H.r[j+1].key)) j ++;
if( !LT(rc.key, H.r[j].key)) break;
H.r[s] = H.r[j];
s = j;
}
H.r[s] = rc;
}
void HeapSort(HeapType &H){
int i; RedType temp;
for(i=H.length/2; i>=1; i--) HeapAdjust(H,i,H.length);
for(i=H.length; i>1; --i) {
temp = H.r[1];
H.r[1] = H.r[i];
H.r[i] = temp;
HeapAdjust(H,1,i-1);
}
}
void CinList(SqList &L, int n){
L.length = n;
printf("Init(%d):\n",n);
for(int i=1;i<=n;i++) scanf("%d",&L.r[i].key);
}
void Print(SqList L){
printf("Out:\n");
for(int i=1;i<=L.length;i++) printf("%d ",L.r[i].key);
printf("\n");
}
int main(){
SqList L;
CinList(L, 8);
HeapSort(L);
Print(L);
return 1;
}
归并排序
#include<stdio.h>
#define EQ(a,b) ( (a)==(b) )
#define LT(a,b) ( (a)< (b) )
#define LQ(a,b) ( (a)> (b) )
#define MAXSIZE 20
typedef int KeyType;
typedef struct {
}InfoType;
typedef struct {
KeyType key;
InfoType otherinfo;
}RedType;
typedef struct {
RedType r[MAXSIZE];
int length;
}SqList;
void Merge(RedType SR[], RedType TR[], int i, int m, int n){
int j, k;
for(k=i,j=m+1; i<=m&&j<=n; ++k){
if(!LQ(SR[i].key,SR[j].key)) TR[k] = SR[i++];
else TR[k] = SR[j++];
}
while (i<=m) TR[k++] = SR[i++];
while (j<=n) TR[k++] = SR[j++];
}
void MSort(RedType SR[], RedType TR1[], int s, int t, int N){
int m; RedType TR2[N+1];
if (s==t) TR1[s] = SR[s];
else{
m = (s+t)/2;
MSort(SR,TR2,s,m,N);
MSort(SR,TR2,m+1,t,N);
Merge(TR2, TR1, s, m, t);
}
}
void MergeSort(SqList &L){
MSort(L.r, L.r, 1, L.length, L.length);
}
void CinList(SqList &L, int n){
L.length = n;
printf("Init(%d):\n",n);
for(int i=1;i<=n;i++) scanf("%d",&L.r[i].key);
}
void Print(SqList L){
printf("Out:\n");
for(int i=1;i<=L.length;i++) printf("%d ",L.r[i].key);
printf("\n");
}
int main(){
SqList L;
CinList(L, 8);
MergeSort(L);
Print(L);
return 1;
}
基数排序
#include<stdio.h>
#define MAX_NUM_OF_KEY 8
#define RADIX 10
#define MAX_SPACE 10000
typedef int KeyType;
typedef struct {}InfoType;
typedef struct {
KeyType keys[MAX_NUM_OF_KEY];
InfoType otheritems;
int next;
}SLCell;
typedef struct {
SLCell r[MAX_SPACE];
int keynum;
int recnum;
}SLList;
typedef int ArrType[RADIX];
void Distribute(SLCell *r, int i, ArrType &f, ArrType &e){
int j, p;
for(j=0; j<RADIX; j++) f[j]=0;
for(p=r[0].next; p; p=r[p].next){
j = r[p].keys[i];
if(!f[j]) f[j]=p;
else r[e[j]].next = p;
e[j] = p;
}
}
void Collect(SLCell *r, int i, ArrType f, ArrType e){
int j, t;
for(j=0; !f[j]; j++);
r[0].next = f[j]; t = e[j];
while(j<RADIX-1){
for(j+=1; j<RADIX-1 && !f[j]; j++);
if(f[j]) {r[t].next = f[j]; t = e[j];}
}
r[t].next = 0;
}
void RadixSort(SLList &L){
for(int i=0;i<L.recnum;i++) L.r[i].next=i+1;
L.r[L.recnum].next = 0;
ArrType f, e;
for(int i=L.keynum-1; i>=0; i--){
Distribute(L.r, i, f, e);
Collect(L.r, i, f, e);
}
}
void CinList(SLList &L, int n, int k){
printf("Init(%d):\n",n);
L.keynum = k;
L.recnum = n;
for(int i=1;i<=n;i++)
for(int j=0;j<k;j++)
scanf("%d",&L.r[i].keys[j]);
}
void Print(SLList L){
printf("Out:\n");
for(int i=0; L.r[i].next!=0;){
i = L.r[i].next;
printf("%d%d%d ",L.r[i].keys[0],L.r[i].keys[1],L.r[i].keys[2]);
}
printf("\n");
}
int main(){
SLList L;
CinList(L, 10, 3);
RadixSort(L);
Print(L);
return 1;
}