您的位置:首页 > 理论基础 > 数据结构算法

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

2017-12-02 16:10 197 查看
排序就是按照递增或者递减的次序整理文件中的记录。

排序分为稳定排序和不稳定排序,什么是稳定,什么又是不稳定?

例如: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息