【数据结构·考研】直接插入排序和二分插入排序

直接插入排序

//直接插入排序 
void InsertSort(int* arr,int len){
	for(int i = 1;i < len;i ++){ //比较len-1趟 
		if(arr[i] < arr[i-1]){ //找到一个不符合队伍特征的元素 
			//把它的值交给temp 
			int temp = arr[i]; 
			arr[i] = arr[i-1];
			//从后向前比较
			int j; 
			for(j = i - 1;j > 0;j --) 
				if(temp < arr[j-1])
					arr[j] = arr[j-1];
				else break; //找到插入位置
			arr[j] = temp; //归位 
		}
	}
}

二分插入排序

//二分插入排序 
void BinaryInsertSort(int* arr,int len){
	for(int i = 1;i < len;i ++){ //比较len-1趟
		//设置二分查找的左右边界 
		int left = 0;
		int right = i - 1;
		//把当前元素值赋给temp 
		int temp = arr[i];
		//二分查找arr[i]应当插入的位置 
		while(left <= right){ //left>right找到了插入位置 
			int mid = (left+right)/2;
			if(temp < arr[mid])
				right = mid - 1;
			else left = mid + 1;
		}
		//其他元素给它挪出地方 
		for(int j = i-1;j >= left;j --)
			arr[j + 1] = arr[j];
		arr[left] = temp; //归位 
	}
} 

代码如下:

#include<iostream>
using namespace std;

//直接插入排序 
void InsertSort(int* arr,int len){
	for(int i = 1;i < len;i ++){ //比较len-1趟 
		if(arr[i] < arr[i-1]){ //找到一个不符合队伍特征的元素 
			//把它的值交给temp 
			int temp = arr[i]; 
			arr[i] = arr[i-1];
			//从后向前比较
			int j; 
			for(j = i - 1;j > 0;j --) 
				if(temp < arr[j-1])
					arr[j] = arr[j-1];
				else break; //找到插入位置
			arr[j] = temp; //归位 
		}
	}
}

//二分插入排序 
void BinaryInsertSort(int* arr,int len){
	for(int i = 1;i < len;i ++){ //比较len-1趟
		//设置二分查找的左右边界 
		int left = 0;
		int right = i - 1;
		//把当前元素值赋给temp 
		int temp = arr[i];
		//二分查找arr[i]应当插入的位置 
		while(left <= right){ //left>right找到了插入位置 
			int mid = (left+right)/2;
			if(temp < arr[mid])
				right = mid - 1;
			else left = mid + 1;
		}
		//其他元素给它挪出地方 
		for(int j = i-1;j >= left;j --)
			arr[j + 1] = arr[j];
		arr[left] = temp; //归位 
	}
} 

int main(){
	int arr1[] = {4,3,5,6,2,7,1,4,9,0};
	InsertSort(arr1,10);
	for(int i = 0;i < 10;i ++) cout<<arr1[i]<<" ";
	cout<<endl;
	int arr2[] = {4,5,6,7,2,1,4,7,8,9};
	BinaryInsertSort(arr2,10);
	for(int i = 0;i < 10;i ++) cout<<arr2[i]<<" ";
}

运行结果:

猜你喜欢

转载自blog.csdn.net/cjw838982809/article/details/108572785