给出一组关键字序列{29,18,25,47,58,12,51,10},分别给出用希尔排序、直接选择排序算法从小到大排序的结果。(转发)

算法思想:
选择排序的基本思想是依次从待排序记录序列中选择出关键字值最小(或最大)的记录、关键字值次之的记录、……,并分别将它们交换到序列的第1个位置、第2个位置、……,从而使记录成为按关键字值由小到大(或由大到小)顺序排列。
希尔排序的基本思想(1)将待排序的记录划分成若干个子序列,分别进行直接插入排序(2)再划分几个大的子序列,进行直接插入排序;反复进行几遍 (3)最后作为一个完整的序列,实施直接插入排序*

#include<stdio.h>//蓝多多算法实验八
#define MAXSIZE 20
typedef int KeyType;
typedef struct {
KeyType key;
}RedType;
typedef struct {
RedType r[MAXSIZE + 1];
int length;
}SqList;
void ShellInsert(SqList& L, int dk);//希尔插入
void ShellSort(SqList& L);//希尔排序
void SelectSort(SqList& L);//直接选择排序
int main()
{
SqList L;
int i;
printf_s(“input 8 elements:”);
for (i = 1; i <= 8; i++)
scanf_s("%d", &L.r[i].key);
L.length = 8;
ShellSort(L);
printf_s(“input the ordList(ShellSort):\n”);
for (i = 1; i <= 8; i++)
printf_s("%5d", L.r[i].key);
printf_s("\n");
SelectSort(L);
printf_s(“input the ordList(SelectSort):\n”);
for (i = 1; i <= 8; i++)
printf_s("%5d", L.r[i].key);
return 0;
}
void ShellInsert(SqList& L, int dk)//希尔插入
{
int i, j;
for (i = dk + 1; i <= L.length; ++i)
if (L.r[i].key < L.r[i - dk].key) {
L.r[0] = L.r[i];
for (j = i - dk; j > 0 && (L.r[0].key < L.r[j].key); j -= dk)
L.r[j + dk] = L.r[j];
L.r[j + dk] = L.r[0];
}
}
void ShellSort(SqList& L)//希尔排序
{
int k;
int dlta[4] = { 4,3,2,1 };
for (k = 0; k < 4; ++k)
ShellInsert(L, dlta[k]);
}
void SelectSort(SqList& L)//直接选择排序
{
int i, j, t;
for (i = 1; i < L.length; ++i) {
for (j = i + 1; j < L.length + 1; ++j)
if (L.r[i].key > L.r[j].key) {
t = L.r[i].key;
L.r[i].key = L.r[j].key;
L.r[j].key = t;
}
}
}

运行结果:略 (VS2019 自己去运行吧)

原文链接:https://blog.csdn.net/qq_43554335/article/details/106986079

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值