#include <iostream>
#include <vector>
using namespace std;
/**
* 插入排序
* 概述:当前i的前面的元素都是有序的,将i索引处的元素插入到前面有序区域合适的位置。
* 时间复杂度:平均情况下,插入排序需要比较(N^2)/4次比较和(N^2)/4次交换。最坏的情况下需要进行(N^2)/2次比较和(N^2)/2次交换。
* 最好的情况下需要进行N-1次比较和0次交换。
* 特点:插入排序所用的时间和数组的初始状态有关。
* 插入排序对于部分有序数组的排序速度很快。
* 部分有效的数组:
* 1.数组中的每个元素距离他们最终位置不远
* 2.一个有序的大数组接一个小数组
* 3.数组中只有几个元素位置不正确
* 总结:插入排序适合部分有序数组和小规模数组。
* @param nums
*/
void InsertionSort(vector<int>& nums){
for(int i = 1;i < nums.size();i++){
for(int j = i;j > 0 && nums[j] < nums[j-1];j--){
int temp = nums[j];
nums[j] = nums[j-1];
nums[j-1] = temp;
}
}
}
//改进插入排序,访问数组的次数减半
void InsertionSortPlus(vector<int>& nums){
for(int i = 1;i < nums.size();i++){
int j = i;
int temp = nums[i];
while(j>0 && temp < nums[j-1]){
nums[j] = nums[j-1];
j--;
}
nums[j] = temp;
}
}
void show(vector<int>& nums){
for(int i = 0;i < nums.size();i++){
cout<<nums[i]<<" ";
}
}
int main() {
int a[] = {7,6,5,4,3,2,1};
vector<int> nums(a,a+7);
InsertionSort(nums);
show(nums);
return 0;
}
#include <iostream>
#include <vector>
using namespace std;
/**
* 插入排序递归版本
* @param nums
* @return
*/
void InsertionSortRecursionVersion(int nums[],int endIndex){
if(endIndex == 0) //先把前0到endIndex个元素排好序
return;
InsertionSortRecursionVersion(nums, endIndex - 1);
//再将最后一个元素插入到前面的有序数组中
int temp = nums[endIndex],i =endIndex;
while (i > 0 && temp < nums[i - 1]) {
nums[i] = nums[i-1];
i--;
}
nums[i] = temp;
}
void show(int nums[],int size){
for(int i = 0;i < size;i++){
cout<<nums[i]<<" ";
}
}
int main() {
int nums[] = {70,6,300,4,20,2,10};
InsertionSortRecursionVersion(nums,6);
show(nums,7);
return 0;
}