大学时数据结构课上写的排序算法

大学时数据结构课上写过的各种排序算法,现在竟然都写不出来了,重新翻出来回忆一下吧

更新:之前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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值