排序——先写单个——再衍生到整体
单个插入排序——在插入前数组里面的数是有序的,然后来了一个数据,就要用这个数组从后往前和这个数比较,
整体的话就是,end从0开始,循环n-1次
void TnsertSort(int* a,int n)
{
int end = 0;
for (end = 0; end < n - 1; end++)
{
int tmp = a[end + 1];
while (end >= 0)//每次最坏的结果就是一直比较到最后一个数
{
if (a[end] < tmp)
{
a[end + 1] = a[end];
}
else
{
break;//不需要再往下比了
}
end--;
}
a[end + 1] = tmp;直接跳出后再这里赋值的好处,当while循环走完了,也就是比较到了最后一个数时循环结束也适用这个赋值
}
}
通过上述直接插入排序可以看出如果所要排序的序列是趋于有序的话,那么他所要交换的次数就变小了,就更快了
把数据序列弄成趋于有序的的方式叫做预排序
先选定一个整数(bas),把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。
bas=3时的预排序
可以发现如果bas=1时的预排序就是直接插入排序,
而希尔排序就是重复多次预排序,bas–,当bas=1时排序就排好了
希尔排序:
void ShellSort(int* a, int n)
{
int bas = n;
while (bas > 1)
{
bas = bas / 2;//控制最后一次bas一定等于1
for (int j = 0; j < bas; j++)
{
int end = j;
for (end = j; end < n - bas; end += bas)
{
int tmp = a[end + bas];
while (end >= 0)
{
if (a[end] < tmp)
{
a[end + bas] = a[end];
end -= bas;
}
else
{
break;
}
}
a[end + bas] = tmp;
}
}
}
//TnsertSort(a, n);
}
希尔排序是对直接插入排序的优化,他的时间复杂度不确定,O(N^1.3) 但是相同情况下时间复杂度一定比直接插入排序低很多