有点晚了哈,今天想讲讲插入排序。
插入排序的核心:通过构建有序序列,对于未排序的数据,在已排序的序列中从后向前扫描,找到相应位置并且插入。
下面有一个简单的动画帮助大家理解:
emm, 插入排序还是相对来说比较简单:
1. 第一个元素咱不用理他,从第二个元素看起,咱先用一个变量来存储待排序的元素,免得被人家替代了,导致人财两空。
2. 从后往前扫描已经排好的数组元素,满足前面的元素大于待排序的元素,就把这个数组元素往后踢,知道找到和待排元素相等或者较小的元素,然后跳出循环(或者一致没找到,循环自动结束即可。)
3. 插入带排序的数组元素即可。
4. 打印已经排序完成的数组元素即可。
代码实现
#include<stdio.h>
int main()
{
int arr[15] = { 3,44,38,5,47,15,36,26,27,2,46,4,19,50,48 };
int i = 0;
int j = 0;
int media;
for (j = 1; j < 15; j++)
{
media = arr[j];
for (i = j - 1; i >= 0; i--)
{
if (arr[i] <= media)
break;
arr[i + 1] = arr[i];
}
arr[i + 1] = media;
}
//打印数据
int m = 0;
for (m = 0; m < 15; m++)
{
printf("%d ", arr[m]);
}
return 0;
}
上面的判断部分还阔以精简一下:
for (j = 1; j < 15; j++)
{
media = arr[j];
for (i = j - 1; (i >= 0 && arr[i] > media); i--)
arr[i + 1] = arr[i];
arr[i + 1] = media;
}
优化选择排序
方法一:
对已经排序好的元素采用二分法的方法查找:二分法想必在高中大家都跟熟悉。一不小心就让大家回想起高中的艰难时光了。采用二分法,即从已排序元素下标的中间开始比较可以达到优化的目的。
方法二:
一次排序时我们可以拿多个元素,对你携带的元素进行比较后,再去与已经排好的元素比较,从大到小一次插入即可。
方法三:
数据链表化。。。。。。。以后再说吧。