【小白打基础系列】排序算法之插入、冒泡与快速排序

本文介绍了三种基础排序算法:直接插入排序、冒泡排序和快速排序。直接插入排序在最好情况下比较次数为n-1,移动次数为0;在最坏情况下比较次数为(n+2)(n-1)/2,移动次数为(n+4)(n-1)/2。冒泡排序在最好情况下只需一趟排序,时间复杂度为O(n)。快速排序平均时间复杂度为O(nlog n),是内部排序中性能较好的方法。文章还提供了每种排序算法的代码示例和优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


直接插入法是最简单的排序法,其排序思想如下:
打牌时,每抓一张牌就将其放到对应的顺序位置。

下面是待排记录的类型定义:

#define MAXSIZE 200
typedef int KeyType//关键字类型
typedef struct{
   
KeyType key;//关键字
InfoType otherinfo;//其他数据项
}RedType;//记录类型
typededf struct{
   
RedType r[MAXSIZE+1];//r[0]闲置或作为哨兵
int length;//顺序表长度
}SqList;

上述的RedType结构体类型实际上是没必要定义的,实际做题时可以写成如下代码,更方便一点:

#define MAXSIZE 200
typedef int KeyType//关键字类型
typededf struct{
   
KeyType r[MAXSIZE+1];//r[0]闲置或作为哨兵
int length;//顺序表长度
}SqList;

直接插入排序算法的描述:

void InsertSort(SqList &L)
{
   
//对顺序表L做直接插入排序
	for(i=2;i<=L.length;i++)
	{
   
		if(L.r[i]<L.r[i-1])
		{
   
			L.r[0]=L.r[i];//r[i]暂存到监视哨中
			L.r[i]=L.r[i-1];//r[i-1]后移
			//记录逐个后移,直到找到插入位置
			for(j=i-2;L.r[0]<L.r[j];j--)
				L.r[j+1]=L.r[j];
			L.r[j+1]=L.r[0];
		
		}
	}	
}

常见错误by小胡
1)低位输出随机数。(记录逐个后移,找到插入位置)三行代码的位置放在了if语句外,导致即便低位符合降序,但仍执行代码,致溢出。

直接插入排序算法分析:

  • 最好的情况是记录序列按关键字有序
  • 比较次数n-1;移动次数0
  • 最坏的情况是记录序列按关键字逆序
  • 比较次数(n+2)(n-1)/2;移动次数(n+4)(n-1)/2
  • 平均情况下比较次数和移动次数约为n2/4,时间复杂度为O(N2)
  • 直接插入排序容易实现,是稳定排序
  • 直接插入排序也适用于链式结构,不需要移动
  • 适用于初始基本有序的情况

希尔排序法是直接插入法的优化,它的思想是先将整个排序序列分成若干子序列,并分别进行直接插入排序,当整个记录中的序列基本有序时,再对全体记录进行一次直接插入排序。

希尔排序法的描述:

void ShellInsert(SqList& L, int dk)
{
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值