1.堆排序
#include <stdio.h>
struct sheet //结构体
{
int number;
char *name;
};
void printer(sheet pupil[],int n) //打印点名册函数
{
int k;
for (k=0;k<n;k++)
{
printf(" 学号:%d,姓名:%s\n",pupil[k].number,pupil[k].name);
}
printf("\n");
}
void headadjust(sheet pupil[],int i,int j) //建堆函数 下标从0开始
{
sheet temp = pupil[i];
int k = 2*i+1;
while (k<=j)
{
if (k<j&&pupil[k].number<pupil[k+1].number)
k++;
if (temp.number<pupil[k].number)
{
pupil[i] = pupil[k];
i = k;
k = 2*k+1;
}
else break;
}
pupil[i] = temp;
}
void headsort(sheet pupil[],int n) // 堆排序算法函数
{
int f=1;
for(int i = n/2-1;i>=0;i--)
headadjust(pupil,i,n-1);
printf("初始建堆:\n");
printer(pupil,8);//打印第一次堆建立
for(i=n-1;i>0;i--)
{
sheet temp = pupil[0];
pupil[0]=pupil[i];
pupil[i] = temp;
headadjust(pupil,0,i-1);
printf("第%d次调整堆:\n",f);
f++;
printer(pupil,8);//打印每次更新堆得内容
}
}
void main()
{
sheet pupil[8] =
{
{120,"马海事"},
{33,"黄广源"},
{64,"梁伟"},
{47,"老炳"},
{11,"dota"},
{550,"科比"},
{310,"林书豪"},
{16,"詹姆斯"}
};
printf(" 初始点名册为:\n");
printer(pupil,8);
headsort(pupil,8);
printf("\n");
printf("最终排序结果:\n");
printer(pupil,8);
getchar();
getchar();
}
2.快速排序
#include <stdio.h>
#define Max 20
struct sheet
{
int number;
char *name;
};
//快速排序算法
void quicksort(sheet pupil[],int left,int right)
{
int i,j;
sheet swap;
if(left < right)
{
i=left;
j=right;
swap = pupil[i];
do
{
while(pupil[j].number>swap.number&&i<j)
j--;
if (i<j)
{
pupil[i]=pupil[j];
i++;
}
while(pupil[i].number<swap.number&&i<j)
i++;
if (i<j)
{
pupil[j]=pupil[i];
j--;
}
} while (i!=j);
pupil[i]=swap;
quicksort(pupil,left,i-1);
quicksort(pupil,i+1,right);
}
}
//归并排序
void merge(sheet number[],int first,int last,int mid)
{
sheet number_temp[Max];
int i=first,j=mid+1,k;
for(k=0;k<=last-first;k++)
{
if (i==mid+1)
{
number_temp[k]=number[j++];
continue;
}
if (j==last+1)
{
number_temp[k]=number[i++];
continue;
}
if (number[i].number<number[j].number)
number_temp[k]=number[i++];
else
number_temp[k]=number[j++];
}
for (i=first,j=0;i<=last;i++,j++)
number[i] = number_temp[j];
}
void merge_sort(sheet number[],int first,int last)
{
int mid=0;
if(first<last)
{
mid=(first+last)/2;
merge_sort(number,first,mid);
merge_sort(number,mid+1,last);
merge(number,first,last,mid);
}
}
//折半查找算法
int BinarySearch(sheet pupil[], int length, int key)
{
int low = 0;
int high = length - 1;
while(low<=high)
{
int mid = (low+high)/2;
if (key==pupil[mid].number) return mid;
else
if (key<pupil[mid].number) high=mid -1;
else low=mid +1;
}
return -1;
}
3.合并排序
#include <stdio.h>
#include <malloc.h>
#include <iostream>
using namespace std;
struct sheet
{
int number;
char *name;
};
void Merge(sheet rawArray[],int firstIndex,int middleIndex,int lastIndex)
{
int firstArrayCount = middleIndex - firstIndex + 1;
int secondArrayCount = lastIndex - middleIndex;
sheet *firstArray = new sheet[firstArrayCount];
sheet *secondArray = new sheet[secondArrayCount];
int i=0;
for ( i = 0; i < firstArrayCount; i++)
{
firstArray[i] = rawArray[firstIndex + i];
}
for ( i = 0; i < secondArrayCount; i++)
{
secondArray[i] = rawArray[middleIndex + i + 1];
}
int firstArrayIndex = 0;
int secondArrayIndex = 0;
int rawArrayIndex = firstIndex;
while (firstArrayIndex < firstArrayCount && secondArrayIndex < secondArrayCount)
{
if (firstArray[firstArrayIndex].number <= secondArray[secondArrayIndex].number)
{
rawArray[rawArrayIndex++] = firstArray[firstArrayIndex++];
}
else
{
rawArray[rawArrayIndex++] = secondArray[secondArrayIndex++];
}
}
while (firstArrayIndex < firstArrayCount)
{
rawArray[rawArrayIndex++] = firstArray[firstArrayIndex++];
}
while (secondArrayIndex < secondArrayCount)
{
rawArray[rawArrayIndex++] = secondArray[secondArrayCount++];
}
}
void MergeSort(sheet rawArray[],int firstIndex,int lastIndex)
{
if (firstIndex < lastIndex)
{
int middleIndex = (firstIndex + lastIndex)/2;
MergeSort(rawArray, firstIndex, middleIndex);
MergeSort(rawArray, middleIndex + 1, lastIndex);
Merge(rawArray, firstIndex, middleIndex, lastIndex);
}
}
void main()
{
sheet pupil[5] =
{
{120,"ma"},
{33,"pang"},
{64,"weil"},
{47,"tiantian"},
{11,"wang"}
};
printf("初始点名册为:\n");
int k;
for (k=0;k<5;k++)
{
printf("学号:%d,姓名:%s\n",pupil[k].number,pupil[k].name);
}
MergeSort(pupil,0,4);
// quicksort(pupil,0,4);
printf("排序后的点名册为:\n");
for (k=0;k<5;k++)
{
printf("学号:%d,姓名:%s\n",pupil[k].number,pupil[k].name);
}
}
4.选择和冒泡排序
#include <stdio.h>
struct sheet
{
int number;
char *name;
};
/*
void select_sort(sheet pupil[],int n) //这是插入排序
{
int a;
sheet swap;
for (int i=1;i < n;i++)
{
for (int k=0;k < i;k++)
{
if (pupil[i].number <= pupil[k].number)
{
swap = pupil[i];
a=k;
while(a<i)
{
pupil[i]=pupil[i-1];
i--;
}
pupil[a] = swap;
break;
}
}
}
}
*/
void select_sort(sheet pupil[],int n)
{
int min=0;
for (int i=0;i < n-1;i++)
{
min=i;
for (int j = i+1;j < n;j++)
{
if (pupil[j].number < pupil[min].number)
{
min =j;
}
}
sheet temp;
temp = pupil[min];
pupil[min] = pupil[i];
pupil[i] = temp;
// swap(&pupil[min],&pupil[i]);
}
}
void bubble_sort(sheet pupil[],int n)
{
sheet temp;
for (int k=n;k>0;k--)
{
for (int i=0; i< k ;i++)
{
if (pupil[i].number>pupil[i+1].number)
{
temp = pupil[i+1];
pupil[i+1] = pupil[i];
pupil[i] = temp;
}
}
}
}
int find(sheet pupil[],int n,int k)
{
for (int i=0;i<n;i++)
{
if (pupil[i].number==k)
{
return i;
}
}
return -1;
}
5.拓扑排序
#include <iostream>
#include <stdlib.h>
#define MAX_VERTEX_NUM 30
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef char InfoType;
typedef char VertexType;
typedef int SElemType;
typedef enum{DG,DN,UDG,UDN}GraphKind;
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
InfoType *info;
}ArcNode;
typedef struct VNode{
VertexType data;
ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct ALGraph{
AdjList vertices;
int vexnum, arcnum;
int kind;
}ALGraph;
typedef struct Stack{
SElemType *base;
SElemType *top;
int stacksize;
}Stack;
int CreateGraph(ALGraph &g); //建立图的邻接表
int LocateVex(ALGraph g, char v); //v在图的邻接表中的位置返回位置i
int FindInDegree(ALGraph g, int indegree[]); //查找每个顶点结点的入度
void TopologicalSort(ALGraph g); //减一法实现的拓扑排序
int InitStack(Stack &s); //初始化栈
int Push(Stack &s, SElemType e); //入栈
int Pop(Stack &s,SElemType &e); //出栈
int StackEmpty(Stack s); //判断是否是空栈
int main(){
int i;
ALGraph g;
CreateGraph(g);
TopologicalSort(g);
system("pause");
return 0;
}
/
int CreateGraph(ALGraph &g){
FILE *fp;
char fileName[20];
printf("输入图形数据文件名:\n");
scanf("%s",fileName);
if((fp=fopen(fileName,"r+"))==NULL){ //读取文件Graph.txt中存储的图信息
printf("无法打开文件\n");
printf("按任意键退出\n");
getchar();getchar();
exit(0);
}
fscanf(fp,"%d %d",&g.vexnum,&g.arcnum); //读结点数和弧数
int i,j,k;
char v1,v2,ch1,ch2;
getchar();
//printf("%d %d\n",g.vexnum,g.arcnum);
fgetc(fp);//吃回车
for(i=0;i<g.vexnum;i++){
fscanf(fp,"%c",&g.vertices[i].data); //建立结点数据
fgetc(fp);//吃空格 //getchar();
g.vertices[i].firstarc = NULL;
}
for(j=0;j<g.arcnum;j++){ //存储弧信息
fscanf(fp,"%c%c%c%c",&v1,&ch1,&ch2,&v2);//getchar();
fgetc(fp);//吃回车
//printf("v1=%c,v2=%c\n",v1,v2);
i = LocateVex(g,v1);
k = LocateVex(g,v2);
if(i==-1 || k==-1) {
if(i==-1) printf("不存在结点%c的值\n",v1);
if(k==-1) printf("不存在结点%c的值\n",v2);
system("pause");
exit(-2);
}
ArcNode *p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = k; //倒序建立弧链表
p->nextarc = g.vertices[i].firstarc;
g.vertices[i].firstarc = p;
}
return 0;
}
int LocateVex(ALGraph g, char v){ //
int i;
for(i=0;i<g.vexnum;i++){
if(g.vertices[i].data==v) break;
}
if(i<g.vexnum) return i;
return -1;
}
void TopologicalSort(ALGraph g){
int i,j,indegree[MAX_VERTEX_NUM]={0};
int count=0;
ArcNode *w = (ArcNode *)malloc(sizeof(ArcNode));
FindInDegree(g,indegree); //查找结点入度,存放到数据indegree中
//for(int o=0;o<g.vexnum;o++){
// printf("%d\n",indegree[o]);
//}
Stack s;
InitStack(s);
for(i=0;i<g.vexnum;i++){
if(indegree[i]==0) {
Push(s,i);
}
}
//system("pause");
printf("拓扑排序序列:");
while(!StackEmpty(s)){
Pop(s,i);
printf("%c ",g.vertices[i].data);
count++;
for(w=g.vertices[i].firstarc;w;w=w->nextarc){
j = w->adjvex;
indegree[j]--;
if(indegree[j]==0) Push(s,j);
}
}
printf("\n");
if(count<g.vexnum) printf("输入的图存在环,拓扑排序无解!\n");
}
int InitStack(Stack &s){
s.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!s.base) exit(-2); //分配出错,溢出
s.top = s.base;
s.stacksize = STACK_INIT_SIZE;
return 1;
}
int Push(Stack &s, SElemType e){
if(s.top-s.base >= s.stacksize){
s.base = (SElemType *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!s.base) exit(-2);
s.top = s.base + s.stacksize;
s.stacksize += STACKINCREMENT;
}
*s.top = e;
s.top++;
return 1;
}
int Pop(Stack &s,SElemType &e){
if(s.top==s.base) return 0;
s.top--;
e = *s.top;
return 1;
}
int StackEmpty(Stack s){
if(s.top==s.base) return 1;
else return 0;
}
int FindInDegree(ALGraph g, int indegree[]){
int i;
ArcNode *w = (ArcNode *)malloc(sizeof(ArcNode));
for(i=0;i<g.vexnum;i++){
for(w=g.vertices[i].firstarc;w;w=w->nextarc){
indegree[w->adjvex]++;
}
}
}
graph.txt
6 7
a b c d e f
a->c
b->c
c->d
c->e
d->e
a->f
f->b