内部排序实验作业

该程序展示了如何使用快速排序和选择排序算法对输入数据进行排序。用户可以选择执行快速排序或选择排序,分别查看排序前后的数据。快速排序通过分治策略实现,选择排序则通过不断选取最小元素来达到排序目的。

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

(填写答案时请注意: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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cai-4

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

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

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

打赏作者

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

抵扣说明:

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

余额充值