插入排序

#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;
}

posted @ 2023-02-03 14:21  破忒头头  阅读(39)  评论(0)    收藏  举报