内部排序实验作业

以下程序利用直接插入排序和冒泡排序算法实现输入数据的排序,请补充完整代码。

(填写答案时请注意:1)字符间不要有空格;2)答案中出现的变量名称严格区分大小写;3)答案中出现的点运算符“.“以及其他运算符号均为英文标点符号,请将输入法切换在英文半角状态下输入。)

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE    50             
typedef int KeyType;                    
typedef struct
{
KeyType  key;        
}RedType;                    
typedef struct{
RedType  r[MAXSIZE+1];        
int length;                   
}SqList;                        
void CreateList(SqList &L)    
{
int data, k;
printf("\n\n输入初始数据(每个数据以空格隔开,-1 结束):\n\n"); 
k = 0;
scanf("%d",&data);
while(data!= -1) 
{
k++; L.r[k].key=data; scanf("%d",&data);
}
L.length=k; 
}
void PrintList(SqList L, int n) 
{
int i;
printf("\n\n 排序前的数据 : ");
for(i = 0; i < n; i++) 
printf("  %d",L.r[i+1].key);
printf("\n\n");
}
void PrintList1(SqList L, int n)      
{
int i;
printf("\n\n 排序后的数据 : ");
for(i = 0; i < n; i++)   
printf("  %d",L.r[i+1].key);
printf("\n\n");
}
void InsertSort(SqList &L, int n)  
{
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];          
for(j=i-1;L.r[0].key<L.r[j].key;--j) 
{
L.r[j+1]=L.r[j]; 
}
L.r[j+1]= L.r[0]; 
}
}
}
void BubleSort(SqList &L, int n) 
{
int i, j;
RedType temp;
for(i = 1; i < n; i++)
for(j = n-1; j >= i; j--)
if(L.r[j + 1].key < L.r[j].key)   
{  
temp = L.r[j + 1]; 
L.r[j + 1] =L.r[j]; 
L.r[j] =temp;
}
}
int main(){
 SqList L;
int flag=0;
while (1) 
{
printf("\n\n各种排序算法及操作选项如下:\n\n");
printf("  1 -- 直接插入排序\n");
printf("  2 -- 冒泡排序\n");
printf("\n\n  请在上述序号中选择一个并输入 : ");
scanf("%d",&flag);
printf("\n\n");
switch(flag)
{
case 1:
CreateList(L);
PrintList(L,L.length);
printf("  1 -- 直接插入排序\n");
InsertSort(L, L.length);
PrintList1(L,L.length);
break;
case 2:
CreateList(L);
PrintList(L,L.length);
printf("  2 -- 冒泡排序\n");
BubleSort(L, L.length);
PrintList1(L,L.length);
break;
case 3:
exit(0);
break;
default:printf("没有您想要的功能");         
}
system("pause");
}
return 0;
}

在这里插入图片描述
在这里插入图片描述
以下程序利用快速排序和选择排序算法实现输入数据的排序,请补充完整代码。(填写答案时请注意:1)字符间不要有空格;2)答案中出现的变量名称严格区分大小写 ;3)答案中出现的点运算符“.”为英文标点符号(英文半角);4)如出现运算表达式:如a加2运算,运算符第一个表达式写变量名称,第二个表达式写数值,结果为”a+2“。)

#include<stdio.h>
#include<stdlib.h>
#define  MAXSIZE    50               
typedef int KeyType;                  
typedef  struct
{
KeyType  key;        
}RedType;                   
typedef  struct{
RedType  r[MAXSIZE+1];        
int length;                  
}SqList;                        
void CreateList(SqList &L)   
{
int data, k;
printf("\n\n输入初始数据(每个数据以空格隔开,-1 结束):\n\n");
k=0; 
scanf("%d",&data);
while(data!= -1)
{
k++;
L.r[k].key=data;
scanf("%d",&data);
}
L.length=k;
}
void PrintList(SqList L, int n) 
{
int i;
printf("\n\n 排序前的数据 : ");
for(i = 0; i < n; i++) 
printf("  %d",L.r[i+1].key);   
printf("\n\n");
}
void PrintList1(SqList L, int n)      
{
int i;
printf("\n\n 排序后的数据 : ");
for(i = 0; i < n; i++)  
printf("  %d",L.r[i+1].key);
printf("\n\n");
}
int Partition(SqList &L, int low, int high)
{
int i, j;
KeyType pivotkey;
L.r[0]= L.r[low]; 
pivotkey=L.r[low].key;
while(low<high){
while((L.r[high].key>=pivotkey)&&(low<high)) high--;  
L.r[low]= L.r[high]; 
while((L.r[low].key<=pivotkey)&&low<high) low++;
L.r[high]=L.r[low];
}
L.r[low]=L.r[0]; 
return low;
}
void QuickSort(SqList &L, int low, int high) 
{
int pivotLoc;
if(low< high)
{
pivotLoc= Partition(L, low, high);     
QuickSort(L, low,pivotLoc-1 );      
QuickSort(L,pivotLoc+1,high);
}
}
void SeleSort(SqList &L, int n) 
{
int i,j,k;
RedType temp;
for(i = 1; i < n; i++)
{
k = i;                    
for(j = i + 1; j <= n; j++)
if(L.r[j].key <L.r[k].key)
k=j;            
if(k != i)        
{
temp = L.r[i];  
L.r[i] = L.r[k];
L.r[k] = temp;
}
}
}
int main(){
SqList L;
CreateList(L);
PrintList(L,L.length);
printf("快速排序\n");
QuickSort(L, 1,L.length);
PrintList1(L,L.length);
printf("直接选择排序\n");
SeleSort(L, L.length);
PrintList1(L,L.length);
return 0;
}

在这里插入图片描述

1.实验目的 掌握内排序,比较各种排序的优、缺点。 2 需求分析 2.1原理 2.1.1、直接排序 算法描述:经过i-1遍处理后,L[1..i-1]己排好序。第i遍处理仅将L[i]插入L[1..i-1]的适当位置,使得L[1..i]又是排好序的序列。要达到这个目的,我们可以用顺序比较的方法。首先比较L[i]和L[i-1],如果L[i-1]≤ L[i],则L[1..i]已排好序,第i遍处理就结束了;否则交换L[i]与L[i-1]的位置,继续比较L[i-1]和L[i-2],直到找到某一个位置j(1≤j≤i-1),使得L[j] ≤L[j+1]时为止。 2.1.2、冒泡排序 算法描述:核心思想是扫描数据清单,寻找出现乱序的两个相邻的项目。当找到这两个项目后,交换项目的位置然后继续扫描。重复上面的操作直到所有的项目都按顺序排好。 2.1.3、快速排序 算法描述:首先检查数据列表中的数据数,如果小于两个,则直接退出程序。如果有超过两个以上的数据,就选择一个分割点将数据分成两个部分,小于分割点的数据放在一组,其余的放在另一组,然后分别对两组数据排序。通常分割点的数据是随机选取的。这样无论你的数据是否已被排列过,你所分割成的两个字列表的大小是差不多的。而只要两个子列表的大小差不多。 2.1.4、选择排序 算法描述:首先找到数据清单中的最小的数据,然后将这个数据同第一个数据交换位置;接下来找第二小的数据,再将其同第二个数据交换位置,以此类推。 2.1.5、堆排序 (1) 基本思想:堆排序是一树形选择排序,在排序过程中,将R[1..N]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。 (2) 堆的定义: N个元素的序列K1,K2,K3,...,Kn.称为堆,当且仅当该序列满足特性: Ki≤K2i Ki ≤K2i+1(1≤ I≤ [N/2]) 2.1.6、希尔排序 算法描述:在直接插入排序算法中,每次插入一个数,使有序序列只增加1个节点,并且对插入下一个数没有提供任何帮助。如果比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换。 2.2要求 1.本程序以下六种常用内部排序算法进行实测比较:冒泡排序,插入排序,选择排序,希尔排序,快速排序,堆排序。 2.排序的元素的关键字为整数。用正序,逆序,不同乱序的数据作测试比较。比较的指标为有关键字参加的比较次数和关键字的移动次数。 3.程序以人机对话的形式进行,每次测试完毕显示各种比较指标值 。 2.3任务 设计一个测试程序比较几种内部排序算法的关键字比较次数和移动次数以取得直观感受。 2.4运行环境 (1)WINDOWSXP系统 (2)C++ 编译环境 3.实验方法 本实验主要是内排序,通过比较的次数和移动的次数判断排序的好坏。主要子函数的说明如下。 1.简单选择排序XuanzePaixu(); 2.冒泡排序MaopaoPaixu(); 3. 直接插入排序CharuPaixu(); 4. 快速排序KuaisuPaixu(); 5. 堆排序DuiPaixu(); 6. 希尔排序 XierPaixu(); 以上的排序算法均采用书中所用的算法程序采用输入的时候仅输入所要的个数,具体的输入数据程序随机产生个数,并且输出。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cai-4

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值