菜鸟学习历程【15-1】直接插入排序

排序就是按照递增或者递减的次序整理文件中的记录。
排序分为稳定排序和不稳定排序,什么是稳定,什么又是不稳定?

例如:3 15 8 8 6 9
在上述6个数字中的排序过程中,如果将两个8的位置交换过,那么就称为不稳定排序,否则就是稳定排序。
换言之,在某个序列的排序过程中,如果对数值相等的数据进行过交换,那么这种排序就被称为不稳定排序,否则就是稳定排序。

排序算法的性能分析:
算法复杂度:算法复杂度分为时间和空间上;
时间复杂度:指程序循环执行总的次数,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。
空间复杂度:运行该算法占用多少空间资源。
辅助空间:指除了存放待排序资源之外,执行算法所需要的其他存储空间。

排序大致可以分为以下八种:
1.直接插入排序;
2.希尔排序;
3.快速排序;
4.冒泡排序;
5.简单选择排序;
6.堆排序;
7.归并排序;
8. 基数排序。

8种排序的稳定性及复杂度,将在最后一个排序内容里一起介绍。

下面,我们对上述8种排序一一进行讲解说明:

1.直接插入排序

分析:直接插入排序,是先假定序列第一个数按顺序排列,从第2个数开始,与之前的所有数一一进行比较,如果前面的数小于自身,那么就交换位置。通过下面的图示结合讲解,我想大家对于直接插入排序会有一定的认识。
第一次遍历,将第2个数与第一个数进行比较,发现小于第一个数,于是交换位置

第二次遍历,将第三个数与第二个数相比较,发现不小于它,于是不再继续往前遍历,结束本轮遍历

第三次,将第四个数依次与前面的数相比较,发现比它大的,就将大数放在其后一个位置上,继续向前遍历,往后挪位置的过程,其实就是为tmp空出位置
这里写图片描述

按照这样的方式,直到遍历到最后个元素,直接插入排序就完成了。

下面附上代码:

#include <stdio.h>

void InsertSort(int arr[], int len)
{
    int i, j, tmp;
    for(i = 1; i < len; i++)
    {
        tmp = arr[i];
        for(j = i - 1; j >= 0; j--)
        {
            if(arr[j] > tmp) //如果a[j]>tmp,就将j对应的内容向后挪一位,再次执行,直到前面没有在比tmp大的
            {              
                arr[j+1] = arr[j];
            }
            else
            {
                break;
            }
        }
        arr[j+1] = tmp;  //为什么最后将tmp的值放在对应的位置呢,而不是找到一个比它小的就交换?
                         //每次遍历时,前面的所有数字已经是一个有序序列,如果i前面数j比它大,先将j
    }                        //放在i的位置,在继续向前找,又发现比它大的k,再将k放在j原来的位置,直到最后
}
int main()
{
    int length;
    int a[] = {29, 18, 35, 27, 8, 30, 15, 5};
    length = sizeof(a) / sizeof(a[0]);

    InsertSort(a, length);
    for(i = 0; i < length; i++)
    {
        printf("%d ", a[i]);
    }
    return 0;   
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值