插入类排序

本文介绍了三种排序算法:直接插入排序,其通过逐步将元素插入已排序序列;折半插入排序,利用折半查找优化插入位置;以及希尔排序,通过设置间隔序列来改进排序效率。每种算法都详细阐述了其思想、过程及C语言实现,并分析了它们的时间复杂度和稳定性。
摘要由CSDN通过智能技术生成

目录

一、直接插入排序

        1.算法思想

         2.排序过程

         3.算法           

二、折半插入排序

         1.算法思想

          2.算法

三、希尔排序

          1.算法思想

          2.排序过程

          3.算法

 四、总结

         


一、直接插入排序

        1.算法思想

             将第i个记录插到前面i-1个已排好的记录中。

        2.排序过程

             对48  62  35  77  55  14  35  98进行排序

             {}内为已排好的序列,_标志的为将要插入的值

             第一步:{48} 62  35  77  55  14  35  98

             第二步:{48  62} 35  77  55  14  35  98   

             第三步:{35  48 62}  77  55  14  35  98 

             第四步:{35  48  62  77} 55  14  35  98 

             第五步:{35  48  55  62  77} 14  35  98 

             第六步:{14  35  48  55  62  77} 35  98 

             第七步:{14  35  35  48  55  62  77} 98 

             第八步:{14  35  35  48  55  62  77  98}

         3.算法           

void InsertSort(int ar[], int left, int right)
{
	for (int i = left + 1; i < right; i++)
	{
		for (int j = i; j > left; j--)
		{
			if (ar[j - 1] > ar[j])
			{
				int tmp = ar[j];
				ar[j] = ar[j - 1];
				ar[j - 1] = tmp;
			}
		}
	}
}

二、折半插入排序

         1.算法思想

               在确定插入位置时,采用折半查找的方法。

           2.算法

void BinInsertSort(int* ar, int left, int right)
{
	for (int i = left + 1; i < right; i++)
	{
		int tmp = ar[i];
		int low = left;
		int high = i - 1;
		//寻找插入位置
		while (low <= high)
		{
			int mid = (low + high) / 2;
			if (tmp >= ar[mid])
				low = mid + 1;
			else
				high = mid - 1;
		}
		//将要排序的值插入
		for (int j = i; j > low; j--)
			ar[j] = ar[j - 1];
		ar[low] = tmp;
	}
}

三、希尔排序

          1.算法思想

               将待排序列的关键字序列分成若干个较小的子序列,对子序列进行直接插入排序。

          2.排序过程

               如图:

 

        3.算法

void _ShellSort(int* ar, int left, int right, int gap)
{
	for (int i = left + gap; i < right; ++i)
	{
		int tmp = ar[i];
		int j = i;
		while (j > left && tmp < ar[j - gap])
		{
			ar[j] = ar[j - gap];
			j -= gap;
		}
		ar[j] = tmp;
	}
}
//分组
void _ShellSort(int* ar, int left, int right)
{
	int dlta[] = { 5,3,2,1 };  //素数
	int n = sizeof(dlta) / sizeof(dlta[0]);

	for (int i = 0; i < n; ++i)
	{
		_ShellSort(ar, left, right, dlta[i]);
	}
}

 四、总结

排序算法时间复杂度最好情况最坏情况空间复杂度稳定性
直接插入O(n^{2})O(n)O(n^{2})O(1)稳定
折半插入O(n^{2})O(nlogn)O(n^{2})O(1)稳定
希尔排序O(n^{1.5})O(1)不稳定

 

 

 

 

         

 

           

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值