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

来源:互联网 发布:最经典的算法书籍 编辑:程序博客网 时间:2024/06/01 15:00

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

例如: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;   }
原创粉丝点击