📄 内部排序算法比较.c
字号:
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#define N 100 /*设置被测数据的个数*/
static long int c=0; /*记录关键字比较次数*/
static long int s=0; /*记录关键字移动次数*/
static int R[N]; /*存放随机产生的被测数据*/
BubbleSort(int R[]) /* 起泡排序,排序元素从R[1]到R[N] */
{ int i,j,t,temp;
for(i=1;i<=N-1;i++)
{ t=N-i;
for(j=0;j<=t-1;j++)
{if(R[j]>R[j+1]) /*比较*/
{ temp=R[j];R[j]=R[j+1];R[j+1]=temp; /*R[j]与R[j-1]进行交换*/
s+=3; /*每交换一次关键字移动次数加3*/
}
c++; /*每比较一次关键字比较次数加1*/
}
}
}
void InsertSort(int R[]) /*直接插入排序,排序元素从R[1]到R[N]*/
{
int i,j;
for(i=2;i<N;i++)
{
R[0]=R[i]; /*把R[i]的值付给监视哨R[0]*/
j=i-1;
while(R[0]<R[j]) /*进行元素移动,以便腾出一个位置插入R[i]*/
{
R[j+1]=R[j--];
s++;
c++;
}
R[j+1]=R[0]; /*在j+1位置处插入R[0]*/
s++;
c++;
}
}
void SelectSort(int R[]) /*简单选择排序,排序元素从R[1]到R[N]*/
{
int i,j,k,temp;
for(i=0;i<N-1;i++) /*选择第i小的记录,并交换到位*/
{
k=i;
for(j=i+1;j<N;j++)
{
if(R[j]<R[k])
k=j; /*如果第j个元素少于第k个元素,则把j的值付给k*/
c++; /*进行了一次比较,c+1*/
}
if(k!=i)
{
temp=R[i];R[i]=R[k];R[k]=temp; /*当k!=i时第k个元素和第i个元素交换*/
s+=3; /*每交换一次关键字移动次数加3*/
}
}
}
void QuickSort(int lo,int hi) /*快速排序,排序元素从R[lo]到R[hi]*/
{
int i,j;
i=lo,j=hi;
if(lo<hi)
{
R[0]=R[lo];s++; /*用R[0]作枢轴记录*/
do /*从数组的两端交替地向中间扫描*/
{
while(j>i&&R[j]>=R[0])
{ j--;c++; }
c++;
if(i<j)
{
R[i]=R[j];i++;s++; /*将比枢轴记录大的记录交换到高端*/
}
while(i<j&&R[i]<=R[0])
{ i++;c++; }
c++;
if(i<j)
{
R[j]=R[i];j--;s++; /*将比枢轴记录小的记录交换到低端*/
}
}while(i<j);
R[i]=R[0];s++; /*枢轴记录到位*/
QuickSort(lo,j-1); /*对低于子表递归排序*/
QuickSort(j+1,hi); /*对高于子表递归排序*/
}
}
void ShellSort(int R[]) /*希尔排序,排序元素从R[1]到R[N]*/
{
int i=4,h=1; /*增量置初值*/
int j,temp;
while (i<=100)
{ i=i*2;h=2*h+1;}
while(h!=0){
i=h/2;
while(i<=N)
{ j=i-h;
while(j>0&&(R[j+h]<R[j]))
{ temp=R[j];R[j]=R[j+h];R[j+h]=temp; /*将R[j]与R[j+h]进行交换*/
j=j-h;
s+=3;c++;
}c++;
i++;
}
h=(h-1)/2; /*减少增量*/
}
}
void sift(int R[],int l,int m) /*堆排序辅助函数*/
{
int i,j;int temp;
i=l;j=2*i; /*R[j]是R[i]的左孩子*/
temp=R[i];s++;
while(j<=m) /*若右孩子较大,则把j修改为右孩子的下标*/
{
if(j<m&&R[j]<R[j+1])j++;c++;
if(temp<R[j])
{
R[i]=R[j]; /*将R[j]调到父亲的位置上*/
i=j; /*修改i和j的值,以便继续向下筛选*/
j=2*i;
s++;
}
else j=m+1; /*筛选运算完成,令j=m+1,以便中止循环*/
c++;
}
R[i]=temp; /*被筛选结点的值放入最终位置*/
s++;
}
void HeapSort(int n) /*堆排序,排序元素从R[1]到R[N]*/
{
int i;
int temp;
for(i=n/2;i>=1;i--)
sift(R,i,n); /*建立初始堆*/
for(i=n;i>=2;i--) /*进行n-1次循环,完成堆排序*/
{ temp=R[i];R[i]=R[1];R[1]=temp; /*将第一个元素同当前区间内最后一个元素对换*/
s+=3;
sift(R,1,i-1); /*筛选R[]的结点,得到i-1个结点的堆*/
}
}
void BeforeSort(int data[]) /*每个排序算法在使用前调用,用于计数器复零*/
{
int i;
for(i=0;i<N;i++)
{ R[i]=data[i]; } /*把data[i]中的元素全部付给R[i]*/
c=0;s=0; /*每次进行排序前计数器复零*/
}
void Compare()
{
int i;
int data[1000]; /*用于存放R[N]比较前的数据,待R[N]排序后重新付给R[N]*/
for(i=0;i<N;i++)
{ R[i]=rand();} /*利用随机函数rand产生待测数据并用数组R[i]来储存*/
for(i=0;i<N;i++)
{ data[i]=R[i];}
printf("\n\t ====================================================\n");
printf("\t内部排序算法\t关键字比较次数\t关键字移动次数\n");
printf("\n");
c=0;s=0;
BubbleSort(R);
printf("\t起泡排序\t%-7ld\t\t%-7ld\n",c,s);
BeforeSort(data);
InsertSort(R);
printf("\t直接插入排序\t%-7ld\t\t%-7ld\n",c,s);
BeforeSort(data);
SelectSort(R);
printf("\t简单选择排序\t%-7ld\t\t%-7ld\n",c,s);
BeforeSort(data);
QuickSort(1,N);
printf("\t快速排序\t%-7ld\t\t%-7ld\n",c,s);
BeforeSort(data);
ShellSort(R);
printf("\t希尔排序\t%-7ld\t\t%-7ld\n",c,s);
BeforeSort(data);
HeapSort(N);
printf("\t堆 排 序\t%-7ld\t\t%-7ld\n",c+1,s);
}
main()
{
char ch1,ch2;
int i,m;
textbackground(NULL); /*改变背景颜色*/
textcolor(BLACK); /*改变字体颜色*/
clrscr(); /*清屏*/
do
{
clrscr();
printf("\t用 一 组 数 据 比 较 请 按 'A' \n");
printf("\t使 用 五 组 数 据 比 较 请 按 'F' \n");
printf("\t使 用 多 组 数 据 比 较 请 按 'M' \n");
printf("\t退 出 系 统 请 按 'Q' \n\n");
scanf("%c",&ch1); /*从键盘输入一个字符,用以选择所要进行的操作*/
getchar(); /*接收一个回车*/
switch(ch1)
{
case'a':
case'A': Compare();break;
case'f':
case'F': for(i=0;i<5;i++) /*利用循环进行五次比较*/
{
Compare();
printf("\n请按回车键继续:");
getchar(); /*从键盘接收一个回车,使所得结果可以分面显示*/
}break;
case'm':
case'M': printf("你想使用多少组数据进行比较:");
scanf("%d",&m);
getchar(); /*从键盘接收一个回车,使所得结果可以分面显示*/
for(i=0;i<m;i++) /*利用循环进行多次比较*/
{
Compare();
printf("\n请按回车键显示下一组结果:");
getchar(); /*从键盘接收一个回车*/
}break;
case'q':
case'Q': printf("\n真的要退出系统 ?");
break;
default: printf("error\n");
}
printf("\n还要继续进行排序比较吗?(Y/N):\n ");
ch2=getchar(); /*从键盘输入一个字符,用以选择所要进行的操作*/
getchar(); /*从键盘接收一个回车*/
}while(ch2!='N'&&ch2!='n');
printf("\n\t Exit successfully!\nPress any key!\n");getch();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -