插入排序的基本思路

【数据结构和算法笔记】插入排序(直接插入排序,折半插入排序,希尔排序)_算法

直接插入排序

【数据结构和算法笔记】插入排序(直接插入排序,折半插入排序,希尔排序)_i++_02

 

【数据结构和算法笔记】插入排序(直接插入排序,折半插入排序,希尔排序)_数据结构_03

【数据结构和算法笔记】插入排序(直接插入排序,折半插入排序,希尔排序)_直接插入排序_04

代码:

void InsertSort(vector<int>&a)
{
	int n=a.size();
	if(n==1)
	return;
	for(int i=1;i<n;i++)
	{
		//a[i]插入到a[0~i-1]中 
		int temp=a[i];
		int j=0;
		//找到第一个比a[i]大的元素下标j,a[i]插入到j的位置 
		while(a[j]<temp)
		{
			j++;
		}
		for(int k=i;k>j;k--)
		{
			a[k]=a[k-1];
		}
		a[j]=temp; 
	}
	return ;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

折半插入排序:

【数据结构和算法笔记】插入排序(直接插入排序,折半插入排序,希尔排序)_排序算法_05

 代码:

在R【0....I-1】找插入下标:二分法查找

如果查找成功,index为mid

如果查找失败,则right<target<left(手动模拟),index为right+1

void BinInsertSort(vector<int>&nums)
{
	for(int i=1;i<nums.size();i++)
	{
		//a[i]插入到a[0...i]中使之有序
		int temp=nums[i];
		int left=0;
		int right=i-1;
		int index;
		while(left<=right)
		{
		  int mid=left+(right-left)/2;
		  if(nums[mid]==nums[i])
		  {
		  	index=mid;
		  	break;
		  }
		  else if(nums[mid]>nums[i])
		  {
		  	 right=mid-1;
		  }
		  else
		  {
		  	left=mid+1;
		  }
		}
		if(right<left)index=right+1;
		for(int k=i;k>index;k--)
		{
			nums[k]=nums[k-1];
		}
		nums[index]=temp;
	}
	return;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.

希尔排序:

【数据结构和算法笔记】插入排序(直接插入排序,折半插入排序,希尔排序)_i++_06