直接插入排序
//直接插入排序
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]<<" ";
}
运行结果: