当前位置:
文档之家› 各种排序方法的比较(C语言版)
各种排序方法的比较(C语言版)
low=1;
high=i-1;
while(low<=high)
{
mid=(low+high)/2;
if(s->r[0].key>=s->r[mid].key)
low=mid+1;
else
high=mid-1;
}
for(j=i-1;j>=high+1;j--)
s->r[j+1]=s->r[j];
s->r[high+1]=s->r[0];
for(i=1;i<=s->length;i++)
//输出排序后的结果!
printf("%-3d",s->r[i].key);
printf("\n");
}
//主函数
void main()
{
sqlist List;
char ch;
List=Init_list();
create_list(List);
typedef struct list{
element r[100];
int length;
}seqlist,*sqlist; //表结构体
//表的初始化
sqlist Init_list(void)
{
sqlist s;
s=(sqlist)malloc(sizeof(seqlist));
if(s)
return s;
for(j=2;j<=s->length-i+1;j++)
{
if(s->r[j].key<s->r[j-1].key)
{
s->r[0]=s->r[j];
s->r[j]=s->r[j-1];
s->r[j-1]=s->r[0];
}
}
printf("数据按由小到大的顺序排列如下:\n\n");
for(i=1;i<=s->length;i++)
scanf("%d",&(s->r[i].key)); printf("\n"); printf("您所输入的数据如下:\n\n"); for(i=1;i<=s->length;i++)
printf("%-3d",s->r[i].key); printf("\n\n"); return 1; } //直接插入排序法 void straightinsert(sqlist s) { int i,j; for(i=2;i<=s->length;i++) {
s->r[0]=s->r[i]; j=i-1; while(s->r[0].key<s->r[j].key) {
s->r[j+1]=s->r[j];
j--;
}
s->r[j+1]=s->r[0];
}
printf("数据按由小到大的顺序排列如下:\n\n");
for(i=1;i<=s->length;i++)
{
case 'A':straightinsert(List);break;
//case 语句后跟的是常量,
可以是整形常量,也可以是字符型常量!
case 'B':Binaryinsert(List); break;
case 'C':Bubblesort(List); break;
case 'D':selectsort(List); break;
//输出排序后的结果!
printf("%-3d",s->r[i].key);
printf("\n");
}
//折半插入排序法
void Binaryinsert(sqlist s)
{
int low,mid,high;
int i,j;
for(i=2;i<=s->length;i++)
{
s->r[0]=s->r[i];
}
printf("数据按由小到大的顺序排列如下:\n\n");
for(i=1;i<=s->length;i++)
//输出排序后的结果!
printf("%-3d",s->r[i].key);
printf("\n");
}
//冒泡排序法
void Bubblesort(sqlist s)
{
int i,j;
for(i=1;i<=s->length-1;i++)
printf("请选择你要使用的数据排序方法!\n\n");
printf("A:直接插入排序法!
B:折半插入排序法!\n\n");
printf("C:冒泡排序法!
D:选择排序法!\n\n");
getchar(); //吸收回车键!
scanf("%c",&ch);
printf("\n");
switch(ch)
实验六 各种排序方法的比较
一、 实验目的 1.通过实验掌握排序的基本概念,对排序的稳定性及排序的时间复杂性有深刻 的认识。 2.掌握各种排序方法的基本思想和算法实现。 3.能够灵活地选用某种排序方法解决问题。 二、 实验要求 1. 认真阅读和掌握本实验的参考程序。 2. 保存程序的运行结果,并结合程序进行分析。 三、 实验内容
default:printf(" 数 据 排 序 方 法 选 项 中 没 有 您 输 入 的 选 项 , 请 重 新 输
入!\n");break;
}
}
二、实验运行结果:
三、实验总结: 该实验的目的是给一组无序的数重新排序,使之按由小到大或由大到小
的顺序排列。纵观该实验的程序,就是将几种不同的排序方法(直接插入排 序,折半插入排序,冒泡排序,选择排序等)放到一起,按自己的意愿,任 选一种,对输入的数据进行处理。在做实验的过程中,也遇到了一些问题, 如选择排序中变量“temp”类型的确定,switch 语句中,字符常量的使用, 还有运行结果的布局等,经过一番思考之后,最终也顺利解决了这些问题。
//输出排序后的结果!
printf("%-3d",s->r[i].key);
printf("\n");
}
//选择排序法
void selectsort(sqlist s)
{
element temp;
//temp 应与下面使用的数组变量的类型相同!
int min;
int i,j;
for(i=1;i<s->length;i++)
{
min=i;
for(j=i+1;j<=s->length;j++)
{
if(s->r[min].key>s->r[j].key)
min=j;
}
if(min!=i)
{
temp=s->r[min];
s->r[min]=s->r[i];
s->r[i]=temp;
}
}
printf("数据按由小到大的顺序排列如下:\n\n");
编写一个程序,对所给的数据(程序中给出或通过键盘初始化均可)进行排 序,要求尽可能多的选择不同的排序算法,并显示排序前和排序后的结果。
一、 实验程序:
#include"stdio.h"
#include"stdlib.h"
typedef struct node{
int key;
}element;
//元素结构体
else return NULL;
} //创建表 int create_list(sqlist s) {
int i; printf("请输入元素的个数:\n"); scanf("%d",&(s->length)); printf("请输入您要输入的%d 个数据:\n\n",s->length); for(i=1;i<=s->length;i++)