直接插入排序、冒泡排序实验详解【数据结构实验报告】

本文详细介绍了两种经典的排序算法——直接插入排序和冒泡排序。直接插入排序通过逐步将元素插入已排序部分实现排序,适合基本有序的数据。冒泡排序则通过相邻元素的不断比较和交换,逐步将大元素“冒”到数组末尾。文中还给出了这两种排序算法的C++实现代码,便于理解与实践。

一、直接插入排序

1、算法思想
直接插入排序(straight insertion sort),有时也简称为插入排序,是减治法的一种典型应用。其基本思想如下:
对于一个数组A[0,n]的排序问题,假设认为数组在A[0,n-1]排序的问题已经解决了。
考虑A[n]的值,从右向左扫描有序数组A[0,n-1],直到第一个小于等于A[n]的元素,将A[n]插在这个元素的后面。
很显然,基于增量法的思想在解决这个问题上拥有更高的效率。

2、直接插入的效率和特点
直接插入排序对于最坏情况(严格递减的数组),需要比较和移位的次数为n(n-1)/2;对于最好的情况(严格递增的数组),需要比较的次数是n-1,需要移位的次数是0。当然,对于最好和最坏的研究其实没有太大的意义,因为实际情况下,一般不会出现如此极端的情况。然而,直接插入排序对于基本有序的数组,会体现出良好的性能,这一特性,也给了它进一步优化的可能性。直接插入排序的时间复杂度是O(n^2),空间复杂度是O(1),同时也是稳定排序。

3、举例
现有一个无序数组,共7个数:89 45 54 29 90 34 68。使用直接插入排序法,对这个数组进行升序排序。
89 45 54 29 90 34 68

45 89 54 29 90 34 68

45 54 89 29 90 34 68

29 45 54 89 90 34 68

29 45 54 89 90 34 68

29 34 45 54 89 90 68

29 34 45 54 68 89 90

4、C++代码实现(核心在InsertSort函数中)

#include <iostream>
using namespace std;

typedef int KeyType;  //给int的别名KeyType
typedef int InfoType;  //给int的别名InfoType 
//数据元素类型定义 
typedef struct
{
   
   
	KeyType key;  //定义数据的关键字域
	InfoType otherinfo;  //定义数据的其他域 
} ElemType;  //数据元素类型名 
//顺序表定义
typedef struct
{
   
   	
	ElemType R[11];  //存储空间的基地址(用R[]数据可以正常输出) 
	int length;  //顺序表的长度
}SqList;  //表类型名

//顺序表的初始化
void Init_SqList(SqList &L)
{
   
   
	int i, flag=-1;
	L.length= 11;  //表长设为10+1,因为需要留一个监视哨R[0]的位置 
	//设置表的前10个数据元素值(无序) 
	for(i=1; i<L.length; i++)  //从1到10的正负摆动交叉数列 
	{
   
   
		L.R[i].key= i*flag;  //初始化为: 下标乘标志位 开始的数字
		flag*=-1;  //每次变一次号 
	}
} 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

鸿蒙Next

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

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

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

打赏作者

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

抵扣说明:

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

余额充值