堆排序
#include <iostream>
using namespace std;
#define MAXSIZE 20
typedef struct
{
int key;
char *otherinfo;
}ElemType;
typedef struct
{
ElemType *r;
int length;
}SqList;
void HeapAdjust(SqList &L,int s,int m)
{
ElemType rc;
int j;
rc=L.r[s];
for(j=2*s;j<=m;j*=2)
{
if(j<m&&L.r[j].key<L.r[j+1].key) ++j;
if(rc.key>=L.r[j].key) break;
L.r[s]=L.r[j]; s=j;
}
L.r[s]=rc;
}
void Create_Sq(SqList &L)
{
int i,n;
cout<<"请输入数据个数,不超过"<<MAXSIZE<<"个。"<<endl;
cin>>n;
cout<<"请输入待排序的数据:\n";
while(n>MAXSIZE)
{
cout<<"个数超过上限,不能超过"<<MAXSIZE<<",请重新输入"<<endl;
cin>>n;
}
for(i=1;i<=n;i++)
{
cin>>L.r[i].key;
L.length++;
}
}
void CreatHeap(SqList &L)
{
int i,n;
n=L.length;
for(i=n/2;i>0;--i)
HeapAdjust(L,i,n);
}
void HeapSort(SqList &L)
{
int i;
ElemType x;
CreatHeap(L);
for(i=L.length;i>1;--i)
{
x=L.r[1];
L.r[1]=L.r[i];
L.r[i]=x;
HeapAdjust(L,1,i-1);
}
}
void show(SqList L)
{
int i;
for(i=1;i<=L.length;i++)
cout<<L.r[i].key<<endl;
}
void main()
{
SqList L;
L.r=new ElemType[MAXSIZE+1];
L.length=0;
Create_Sq(L);
HeapSort(L);
cout<<"排序后的结果为:"<<endl;
show(L);
}
归并排序
#include <iostream>
using namespace std;
#define MAXSIZE 20
typedef struct
{
int key;
char *otherinfo;
}RedType;
typedef struct
{
RedType *r;
int length;
}SqList;
void Create_Sq(SqList &L)
{
int i,n;
cout<<"请输入数据个数,不超过"<<MAXSIZE<<"个。"<<endl;
cin>>n;
cout<<"请输入待排序的数据:\n";
while(n>MAXSIZE)
{
cout<<"个数超过上限,不能超过"<<MAXSIZE<<",请重新输入"<<endl;
cin>>n;
}
for(i=1;i<=n;i++)
{
cin>>L.r[i].key;
L.length++;
}
}
void Merge(RedType R[],RedType T[],int low,int mid,int high)
{
int i,j,k;
i=low; j=mid+1;k=low;
while(i<=mid&&j<=high)
{
if(R[i].key<=R[j].key) T[k++]=R[i++];
else T[k++]=R[j++];
}
while(i<=mid)
T[k++]=R[i++];
while(j<=high)
T[k++]=R[j++];
}
void MSort(RedType R[],RedType T[],int low,int high)
{
int mid;
RedType *S=new RedType[MAXSIZE];
if(low==high) T[low]=R[low];
else
{
mid=(low+high)/2;
MSort(R,S,low,mid);
MSort(R,S,mid+1,high);
Merge(S,T,low,mid,high);
}
}
void MergeSort(SqList &L)
{
MSort(L.r,L.r,1,L.length);
}
void show(SqList L)
{
int i;
for(i=1;i<=L.length;i++)
cout<<L.r[i].key<<endl;
}
int main()
{
SqList R;
R.r=new RedType[MAXSIZE+1];
R.length=0;
Create_Sq(R);
MergeSort(R);
cout<<"堆排序,排序后的结果为:"<<endl;
show(R);
return 0;
}
基排序
#include<iostream>
using namespace std;
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define MAXNUM_KEY 8
#define RADIX 10
#define MAX_SPACE 10000
typedef char KeysType;
typedef int InfoType;
typedef struct
{
KeysType keys[MAXNUM_KEY];
InfoType otheritems;
int next;
}SLCell;
typedef struct
{
SLCell r[MAX_SPACE];
int keynum;
int recnum;
}SLList;
typedef int ArrType[RADIX];
void InitList(SLList *L)
{
char c[MAXNUM_KEY],c1[MAXNUM_KEY];
int i,j,n,max;
max=-10000;
cout<<"请输入数据个数,不超过"<<MAX_SPACE<<"个。\n";
cin>>n;
while(n>MAX_SPACE)
{
cout<<"您输入的个数超过上限,请重新输入,不超过"<<MAX_SPACE<<"个。\n";
cin>>n;
}
int *D=new int[n];
cout<<"请输入"<<n<<"个排排序的数据:\n";
for(i=0;i<n;i++)
{
cin>>D[i];
if(max<D[i])
max=D[i];
}
(*L).keynum=(int)(ceil(log10(max)));
(*L).recnum=n;
for(i=1;i<=n;i++)
{
itoa(D[i-1],c,10);
for(j=strlen(c);j<(*L).keynum;j++)
{
strcpy(c1,"0");
strcat(c1,c);
strcpy(c,c1);
}
for(j=0;j<(*L).keynum;j++)
(*L).r[i].keys[j]=c[(*L).keynum-1-j];
}
}
int ord(char c)
{
return c-'0';
}
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=ord(r[p].keys[i]);
if(!f[j]) f[j]=p;
else r[e[j]].next=p;
e[j]=p;
}
}
int succ(int i)
{
return ++i;
}
void Collect (SLCell *r,int i,ArrType &f,ArrType &e)
{
int j,t;
for(j=0;!f[j];j=succ(j));
r[0].next=f[j];t=e[j];
while(j<RADIX-1)
{
for(j=succ(j);j<RADIX-1&&!f[j];j=succ(j)) ;
if(f[j]) {
r[t].next=f[j];t=e[j];}
}
r[t].next=0;
}
void RadixSort(SLList &L)
{
int i;
ArrType f,e;
for(i=0;i<L.recnum;++i) L.r[i].next=i+1;
L.r[L.recnum].next = 0;
for(i=0;i<L.keynum;++i)
{
Distribute(L.r,i,f,e);
Collect(L.r,i,f,e);
}
}
void print(SLList L)
{
int i,j;
for(i=1;i<=L.recnum;i++)
{
for(j=L.keynum-1;j>=0;j--)
cout<<L.r[i].keys[j];
cout<<endl;
}
}
void Sort(SLList L,int adr[])
{
int i=1,p=L.r[0].next;
while(p)
{
adr[i++]=p;
p=L.r[p].next;
}
}
void Rearrange(SLList *L,int adr[])
{
int i,j,k;
if(adr[i]!=i)
{
j=i;
(*L).r[0]=(*L).r[i];
while(adr[j]!=i)
{
k=adr[j];
(*L).r[j]=(*L).r[k];
adr[j]=j;
j=k;
}
(*L).r[j]=(*L).r[0];
adr[j]=j;
}
}
int main()
{
SLList l;
int *adr;
InitList(&l);
RadixSort(l);
adr=new int[l.recnum];
Sort(l,adr);
Rearrange(&l,adr);
cout<<"排序后(重排记录):\n";
print(l);
return 0;
}
简单选择排序
#include <iostream>
using namespace std;
#define MAXSIZE 20
typedef struct
{
int key;
char *otherinfo;
}ElemType;
typedef struct
{
ElemType *r;
int length;
}SqList;
void SelectSort(SqList &L)
{
int i,j,k;
ElemType t;
for(i=1;i<L.length;++i)
{
k=i;
for(j=i+1;j<=L.length;++j)
if(L.r[j].key<L.r[k].key) k=j;
if(k!=i) {
t=L.r[i];L.r[i]=L.r[k];L.r[k]=t;}
}
}
void Create_Sq(SqList &L)
{
int i,n;
cout<<"请输入数据个数,不超过"<<MAXSIZE<<"个。"<<endl;
cin>>n;
cout<<"请输入待排序的数据:\n";
while(n>MAXSIZE)
{
cout<<"个数超过上限,不能超过"<<MAXSIZE<<",请重新输入"<<endl;
cin>>n;
}
for(i=1;i<=n;i++)
{
cin>>L.r[i].key;
L.length++;
}
}
void show(SqList L)
{
int i;
for(i=1;i<=L.length;i++)
cout<<L.r[i].key<<endl;
}
int main()
{
SqList L;
L.r=new ElemType[MAXSIZE+1];
L.length=0;
Create_Sq(L);
SelectSort(L);
cout<<"简单选择排序后的结果为:"<<endl;
show(L);
return 0;
}
快速排序
#include <iostream>
using namespace std;
#define MAXSIZE 20
typedef struct
{
int key;
char *otherinfo;
}ElemType;
typedef struct
{
ElemType *r;
int length;
}SqList;
int Partition(SqList &L,int low,int high)
{
int pivotkey;
L.r[0]=L.r[low];
pivotkey=L.r[low].key;
while(low<high)
{
while(low<high&&L.r[high].key>=pivotkey) --high;
L.r[low]=L.r[high];
while(low<high&&L.r[low].key<=pivotkey) ++low;
L.r[high]=L.r[low];
}
L.r[low]=L.r[0];
return low;
}
void QSort(SqList &L,int low,int high)
{
int pivotloc;
if(low<high)
{
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 Create_Sq(SqList &L)
{
int i,n;
cout<<"请输入数据个数,不超过"<<MAXSIZE<<"个。"<<endl;
cin>>n;
cout<<"请输入待排序的数据:\n";
while(n>MAXSIZE)
{
cout<<"个数超过上限,不能超过"<<MAXSIZE<<",请重新输入"<<endl;
cin>>n;
}
for(i=1;i<=n;i++)
{
cin>>L.r[i].key;
L.length++;
}
}
void show(SqList L)
{
int i;
for(i=1;i<=L.length;i++)
cout<<L.r[i].key<<endl;
}
int main()
{
SqList L;
L.r=new ElemType[MAXSIZE+1];
L.length=0;
Create_Sq(L);
QuickSort(L);
cout<<"快速排序后的结果为:"<<endl;
show(L);
return 0;
}
冒泡排序
#include <iostream>
using namespace std;
#define MAXSIZE 20
typedef struct
{
int key;
char *otherinfo;
}ElemType;
typedef struct
{
ElemType *r;
int length;
}SqList;
void BubbleSort(SqList &L)
{
int m,j,flag;
ElemType t;
m=L.length-1; flag=1;
while((m>0)&&(flag==1))
{
flag=0;
for(j=1;j<=m;j++)
if(L.r[j].key>L.r[j+1].key)
{
flag=1;
t=L.r[j];L.r[j]=L.r[j+1];L.r[j+1]=t;
}
--m;
}
}
void Create_Sq(SqList &L)
{
int i,n;
cout<<"请输入数据个数,不超过"<<MAXSIZE<<"个。"<<endl;
cin>>n;
cout<<"请输入待排序的数据:\n";
while(n>MAXSIZE)
{
cout<<"个数超过上限,不能超过"<<MAXSIZE<<",请重新输入"<<endl;
cin>>n;
}
for(i=1;i<=n;i++)
{
cin>>L.r[i].key;
L.length++;
}
}
void show(SqList L)
{
int i;
for(i=1;i<=L.length;i++)
cout<<L.r[i].key<<endl;
}
int main()
{
SqList L;
L.r=new ElemType[MAXSIZE+1];
L.length=0;
Create_Sq(L);
BubbleSort(L);
cout<<"冒泡排序后的结果为:"<<endl;
show(L);
return 0;
}
数组排序qsort函数
#include <iostream>
using namespace std;
#define MAXSIZE 20
typedef struct
{
int key;
char *otherinfo;
}ElemType;
typedef struct
{
ElemType *r;
int length;
}SqList;
void BubbleSort(SqList &L)
{
int m,j,flag;
ElemType t;
m=L.length-1; flag=1;
while((m>0)&&(flag==1))
{
flag=0;
for(j=1;j<=m;j++)
if(L.r[j].key>L.r[j+1].key)
{
flag=1;
t=L.r[j];L.r[j]=L.r[j+1];L.r[j+1]=t;
}
--m;
}
}
void Create_Sq(SqList &L)
{
int i,n;
cout<<"请输入数据个数,不超过"<<MAXSIZE<<"个。"<<endl;
cin>>n;
cout<<"请输入待排序的数据:\n";
while(n>MAXSIZE)
{
cout<<"个数超过上限,不能超过"<<MAXSIZE<<",请重新输入"<<endl;
cin>>n;
}
for(i=1;i<=n;i++)
{
cin>>L.r[i].key;
L.length++;
}
}
void show(SqList L)
{
int i;
for(i=1;i<=L.length;i++)
cout<<L.r[i].key<<endl;
}
int main()
{
SqList L;
L.r=new ElemType[MAXSIZE+1];
L.length=0;
Create_Sq(L);
BubbleSort(L);
cout<<"冒泡排序后的结果为:"<<endl;
show(L);
return 0;
}
希尔排序
#include <iostream>
using namespace std;
#define MAXSIZE 20
typedef struct
{
int key;
char *otherinfo;
}ElemType;
typedef struct
{
ElemType *r;
int length;
}SqList;
void ShellInsert(SqList &L,int dk)
{
int i,j;
for(i=dk+1;i<=L.length;++i)
if(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 dt[ ],int t){
int k;
for(k=0;k<t;++k)
ShellInsert(L,dt[k]);
}
void Create_Sq(SqList &L)
{
int i,n;
cout<<"请输入数据个数,不超过"<<MAXSIZE<<"个。"<<endl;
cin>>n;
cout<<"请输入待排序的数据:\n";
while(n>MAXSIZE)
{
cout<<"个数超过上限,不能超过"<<MAXSIZE<<",请重新输入"<<endl;
cin>>n;
}
for(i=1;i<=n;i++)
{
cin>>L.r[i].key;
L.length++;
}
}
void show(SqList L)
{
int i;
for(i=1;i<=L.length;i++)
cout<<L.r[i].key<<endl;
}
int main()
{
SqList L;
L.r=new ElemType[MAXSIZE+1];
L.length=0;
Create_Sq(L);
int i,t;
int *dt=new int[MAXSIZE];
cout<<"请输入增量个数:\n";
cin>>t;
for(i=0;i<t;i++)
{
cout<<"第"<<i+1<<"个增量:\n";
cin>>dt[i];
}
ShellSort(L,dt,t);
cout<<"排序后的结果为:"<<endl;
show(L);
return 0;
}
折入插入排序
#include <iostream>
using namespace std;
#define MAXSIZE 20
typedef struct
{
int key;
char *otherinfo;
}ElemType;
typedef struct
{
ElemType *r;
int length;
}SqList;
void BInsertSort(SqList &L){
int i,j,low,high,m;
for(i=2;i<=L.length;++i)
{
L.r[0]=L.r[i];
low=1; high=i-1;
while(low<=high)
{
m=(low+high)/2;
if(L.r[0].key<L.r[m].key) high=m-1;
else low=m+1;
}
for(j=i-1;j>=high+1;--j) L.r[j+1]=L.r[j];
L.r[high+1]=L.r[0];
}
}
void Create_Sq(SqList &L)
{
int i,n;
cout<<"请输入数据个数,不超过"<<MAXSIZE<<"个。"<<endl;
cin>>n;
cout<<"请输入待排序的数据:\n";
while(n>MAXSIZE)
{
cout<<"个数超过上限,不能超过"<<MAXSIZE<<",请重新输入"<<endl;
cin>>n;
}
for(i=1;i<=n;i++)
{
cin>>L.r[i].key;
L.length++;
}
}
void show(SqList L)
{
int i;
for(i=1;i<=L.length;i++)
cout<<L.r[i].key<<endl;
}
int main()
{
SqList L;
L.r=new ElemType[MAXSIZE+1];
L.length=0;
Create_Sq(L);
BInsertSort(L);
cout<<"排序后的结果为:"<<endl;
show(L);
return 0;
}
直接插入排序
#include <iostream>
using namespace std;
#define MAXSIZE 20
typedef struct
{
int key;
char *otherinfo;
}ElemType;
typedef struct
{
ElemType *r;
int length;
}SqList;
void InsertSort(SqList &L)
{
int i,j;
for(i=2;i<=L.length;++i)
if(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; L.r[0].key<L.r[j].key;--j)
L.r[j+1]=L.r[j];
L.r[j+1]=L.r[0];
}
}
void Create_Sq(SqList &L)
{
int i,n;
cout<<"请输入数据个数,不超过"<<MAXSIZE<<"个。"<<endl;
cin>>n;
cout<<"请输入待排序的数据:\n";
while(n>MAXSIZE)
{
cout<<"个数超过上限,不能超过"<<MAXSIZE<<",请重新输入"<<endl;
cin>>n;
}
for(i=1;i<=n;i++)
{
cin>>L.r[i].key;
L.length++;
}
}
void show(SqList L)
{
int i;
for(i=1;i<=L.length;i++)
cout<<L.r[i].key<<endl;
}
int main()
{
SqList L;
L.r=new ElemType[MAXSIZE+1];
L.length=0;
Create_Sq(L);
InsertSort(L);
cout<<"排序后的结果为:"<<endl;
show(L);
return 0;
}