插入排序--直接插入、折半插入、希尔排序

本文详细介绍了三种排序算法:直接插入排序、折半插入排序以及希尔排序。通过实例演示了它们的实现过程,对比了各自的效率和适用场景,为理解排序算法提供深入解析。

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

 

//1、直接插入排序
vector<int> insertSort(vector<int>& nums)
{
	int len = nums.size();		
	//假定第0个数有序,从第1个数开始插入
	for (int j = 1; j < len; j++)
	{
		int temp = nums[j];	
		int i = j;           // [0,1,2,...j-1, j ,j+1,len-1]  temp = j
		//找插入点           //  [0,1,2,...j-1,   ,j+1,len-1]        
                            //            i-1  i
		while (temp > nums[i-1])
		{			
			nums[i] = nums[i-1];//后移	
			i--; // 继续比较下一个数

			//注意i不能出界
			if (i == 0) 
			{
				break;
			}
		}		
		nums[i] = temp;		
	}
	return nums;	
}
// 2、折半插入排序
vector<int> binaryInsertSort(vector<int>& nums)
{	
	int len = nums.size();
	//假定第0个数有序,从第1个数开始插入
	for (int j = 1; j < len; j++)
	{
		int temp = nums[j];	  // [0,1,2,...,j-1,   j,j+1,...,len-1]		   
		int left = 0;         //取出j插入,二分查找区间[0,j-1]
		int right = j - 1;
		while (left <= right)//找插入点
		{
			int mid = (left + right) / 2;
			if (temp > nums[mid]) //左半部分查找
			{
				right = mid - 1;
			}
			else  //右半部分
			{
				left = mid + 1;
			}			
		}
		// 找到插入点后,插入点left到j-1中间的元素整块后移
		for (int k = j - 1; k >= left; k--)
		{
			nums[k+1] = nums[k];
		}
		nums[left] = temp; // 插入		
	}
	return nums;
}

//3 希尔排序
vector<int> shellSort(vector<int>& nums)
{	  
	int len = nums.size()		;	
	//初始gap=len/2 
   // 每次gap/2,... gap=1(将所有元素排序),gap= 0结束
	for (int gap = len/2; gap > 0; gap /= 2)  
	{	
		//直接插入排序 逆序		
		for (int j = gap; j < len; j++)
		{		
			int temp = nums[j]; //取出待插入的数				
			int i = j;  //每个小组内,插入点的相对查找区间[0,i] 			
			//比前一个元素大,继续找插入点,比较下一个元素i-gap
			for (i; i >= gap  && temp > nums[i - gap]; i -= gap) 
			{
				nums[i] = nums[i - gap]; // 后移	每小组相邻元素,相差gap
			}
			nums[i] = temp;//插入		
		}
	}
	return nums;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值