文章目录
阅读代码是件非常枯燥的事,所以尽量每一行都加的注释,方便阅读理解。
六、排序
(一)插入类排序
1、直接插入排序
/*
method:
直接插入排序法
param:
disorder_sqc 无序序列
num 无序序列的长度
*/
int Insert_Direct(int disorder_sqc[], int num)
{
int i = 0,j = 0;
int temp = 0; //临时变量
for (i = 1; i < num; ++i) //i=1,默认前面已经有一个元素是有序的
{
temp = disorder_sqc[i]; //获取当前值
j = i - 1; //获取当前下标
while (j >= 0 && temp < disorder_sqc[j]) //从当前下标往前依次判断
{
disorder_sqc[j + 1] = disorder_sqc[j]; //当前位置元素如果比待插入值大,往后移动一个元素,给插入值腾地方
--j;
}
disorder_sqc[j+1] = temp; //插入值
}
}
2、折半插入排序
/*
method:
折半插入排序法
param:
order_sqc 无序序列
num 无序序列的长度
*/
void Half_Insert(int disorder_sqc[], int num)
{
int i = 0;
int temp = 0;
int low = 0, high = 1, mid = 0,final_ = 0; //final_指向最终插入的位置
if (disorder_sqc[0] > disorder_sqc[1]) //默认是升序排序,如果前两个不是升序,交换位置
{
temp = disorder_sqc[1];
disorder_sqc[1] = disorder_sqc[0];
disorder_sqc[0] = temp;
}
for (i = 2; i < num; ++i)
{
low = 0;
high = i - 1; //因为有序数组在插入过程中不断的边长,所以high跟着变
temp = disorder_sqc[i]; //temp获取要插入值的临时变量
if (disorder_sqc[i] > disorder_sqc[high]) //如果大于最大的,则不用排序
final_ = i; //直接插入到最后
else if (disorder_sqc[i] < disorder_sqc[low]) //如果小于最小的,直接放在最前方
final_ = 0;
else
{
while (low <= high) //以low<high为判断标准
{
mid = (low + high) / 2; //mid 因为int型,向下取整
if (disorder_sqc[mid] > temp) //如果该位置的值大于要插入的值
high = mid - 1; //说明值在mid位置的左边,默认为升序排序
else
low = mid + 1; //否则在mid位置的右边,默认为升序排序
}
final_ = low;