排序算法03-插入排序

£可爱£侵袭症+ 提交于 2020-01-31 21:44:01

简单插入排序

/**
 * 时间复杂度为O(n^2)
 */ 

#include<iostream>
using namespace std;

//这里从1号元素开始排序
void InsertSort(int* nums, int len){
    int temp;
    for(int i=2; i<len; i++)
    {
        if(nums[i] < nums[i-1])
        {
            //待排序元素放在0号位置,如果待排序元素当前不是最小,那么提前插入
            //如果待排序元素当前是最小,也不会越界,起到哨兵作用
            nums[0] = nums[i];
            //在有序部分找到合适的地方,让nums[i]插入
            for(int j=i-1; nums[j]>nums[0]; j--)
            {
                nums[j+1] = nums[j];
                temp = j;//记录当前后移元素
            }
            nums[temp] = nums[0];
        }
    }
}

void show(int* nums, int len){
    for(int i=1; i<len; i++){
        cout<<nums[i]<<" ";
    }
}

int main(){
    int nums[10] = {0,22,0,3,4,1,5,3,6,2};
    int len = sizeof(nums)/sizeof(nums[0]);
    cout<<"数组数据为:";
    show(nums,len);
    cout<<endl;
    InsertSort(nums, len);
    cout<<"排序结果为:";
    show(nums,len);
    return 0;
}

运行结果:
在这里插入图片描述

希尔排序

/**
 * 希尔排序就是改变步长的插入排序
 * 由于拆成多部分操作,若存在相同元素,被划分为不同部分后
 * 值相同的元素之间没有联系,故希尔排序不稳定
 */ 

#include<iostream>
using namespace std;

//这里从0号元素开始排序
void ShellSort(int* nums, int len, int gap){
    int temp;//记录待排序元素
    int pos;//记录待排序元素可能插入的位置
    while( gap >= 1){
        //j从gap开始,i前面的元素都是本次步长情况下的第一个元素
        for(int i=gap; i<len; i++){
            //后面元素小则进行插入排序
            if(nums[i] < nums[i-gap]){
                temp = nums[i];
                for(int j=i-gap; nums[j]>temp&&j>0; j -= gap){
                    nums[j+gap] = nums[j];//位置j的值已经被移走
                    pos = j;//将此位置记下,可能为待插入值的位置
                }
                nums[pos] = temp;
            } 
        }
        gap /= 2;
    }
}

void show(int* nums, int len){
    for(int i=0; i<len; i++){
        cout<<nums[i]<<" ";
    }
}

int main(){
    int nums[10] = {0,22,0,3,4,1,5,3,6,2};
    int len = sizeof(nums)/sizeof(nums[0]);
    int gap = 4;
    cout<<"数组数据为:";
    show(nums, len);
    cout<<endl;
    ShellSort(nums, len, gap);
    cout<<"排序结果为:";
    show(nums, len);
    return 0;
}

运行结果:
在这里插入图片描述

排序算法的比较

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!