大学时数据结构课上写过的各种排序算法,现在竟然都写不出来了,重新翻出来回忆一下吧
更新:之前visual studio 6.0编译通过正常运行的,现在放到gcc环境下编译通不过了……原因是gcc按照纯c语言编译,没有c++所谓的“按引用传递”,所以编译出错,改为g++编译就OK了
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define Status int
#define MAXSIZE 20
#define ERROR 0
#define OK 1
#define KeyType int
#define ElemType int
#define InfoType int
#define NULL 0
typedef struct{
KeyType key ;//关键字项
InfoType otherinfo;//其他数据项
}RedType;//记录类型
typedef struct{
RedType *r;//r[0]用作哨兵
int length;//顺序表长度
int listsize;
}SqList;//顺序表类型
Status InitList_Sq(SqList &L){//创建顺序表
int n;
L.r=(RedType*)malloc((MAXSIZE+1)*sizeof(RedType));
L.length=0;
printf("please input L.listsize(less than %d):\n",MAXSIZE);
scanf("%d,",&n);
L.listsize=n+1;
return OK;
}
Status ListInsert_Sq(SqList &L){//顺序表中插入关键字
int i;
for(i=1;i<L.listsize;i++){
printf("Please input the %dth key\n",i);
scanf("%d,",&L.r[i].key);
L.length++;
}
return OK;
}
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 BInsertSort(SqList L){//插入排序之折半插入排序
int i,j,low,high,m;
for(i=2;i<=L.length;i++)
if(L.r[i].key<L.r[i-1].key){
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 BubbleSort(SqList L){//交换排序之冒泡排序
int i,j,lastExchangeIndex;
i=L.length;
while(i>1){
lastExchangeIndex=1;
for(j=1;j<i;j++)
if(L.r[j+1].key<L.r[j].key){
L.r[0]=L.r[j];
L.r[j]=L.r[j+1];
L.r[j+1]=L.r[0];
lastExchangeIndex=j;
}
i=lastExchangeIndex;
}
}
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 SelectSort(SqList L){//选择排序之简单选择排序
int i,j,min;
for(i=1;i<L.listsize;i++){
min=i;
for(j=i;j<L.listsize;j++){
if(L.r[min].key>L.r[j].key)
min=j;
}
if(i!=min){
L.r[0]=L.r[i];
L.r[i]=L.r[min];
L.r[min]=L.r[0];
}
}
}
void HeapAdjust(SqList L,int s,int m){//选择排序之堆排序
int j;
L.r[0]=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(!(L.r[0].key<L.r[j].key))break;
L.r[s]=L.r[j];s=j;
}
L.r[s]=L.r[0];
}
void HeapSort(SqList L){//选择排序之堆排序
int i;
for(i=L.length/2;i>0;i--)
HeapAdjust(L,i,L.length);
for(i=L.length;i>1;i--){
L.r[0]=L.r[i];
L.r[i]=L.r[1];
L.r[1]=L.r[0];
HeapAdjust(L,1,i-1);
}
}
void Print(SqList L){
int i;
for(i=1;i<L.listsize;i++)
printf("the %dth key is :%d\n",i,L.r[i].key);
}
int main(){
SqList L;
int k;
InitList_Sq(L);//创建顺序表
ListInsert_Sq(L);//顺序表中插入关键字
printf("please input Sort kind for\n1(插入排序之直接插入排序)2(插入排序之折半插入排序)\n");
printf("3(交换排序之冒泡排序)4(交换排序之快速排序)\n");
printf("5(选择排序之简单选择排序)6(选择排序之堆排序)\n");
scanf("%d,",&k);
switch(k){
case 1: InsertSort(L);break;//插入排序之直接插入排序
case 2: BInsertSort(L);break;//插入排序之折半插入排序
case 3: BubbleSort(L);break;//快速排序之冒泡排序
case 4: QSort(L,1,L.listsize-1);break;//交换排序之快速排序
case 5: SelectSort(L);break;//选择排序之简单选择排序
case 6: HeapSort(L);break;//选择排序之堆排序
}
Print(L);
return 0;
}