插入排序
以下数组
默认第一个元素处于有序状态,从第二个元素开始看:
拿出2,向前看 前面就一个4 所以2 在4之前
依次 当拿出元素前面没有比它大的 放在原位即可。
所以每次要关注排序的位置和元素
//插入排序
int insertp(int arr[],int index){
//遍历数组
for (int i = 0; i < index-1;i++){
//记录数组有序末尾元素位序
int end = i;
//记录数组无序第一个元素值
int tep = arr[end + 1];
//判断 末尾元素 是否 比前一个元素小
while (tep<arr[end]&&end>=0)
{
//数据后移
arr[end + 1] = arr[end];
end--;
}
//这里输出值 1.比任何值都大放原位 2.比任何值都小经过while判断
arr[end + 1] = tep;
}
}
希尔排序
希尔排序是直接插入排序的进阶版本,多一个步l
例如下面数组
数组长度为8 可以分为 4组 32,22,84,65
对每一组进行插入排序,红 黄 绿 蓝根据排序交换元素位置不变
最后将排完的结构再进行一次插入排序即可
void ShellSort(int* arr, int size)
{
int gap = size;
while (gap > 1)
{
gap = gap / 2; //调整希尔增量
int i = 0;
for (i = 0; i < size - gap; i++) //从0遍历到size-gap-1
{
int end = i;
int temp = arr[end + gap];
while (end >= 0)
{
if (arr[end] > temp)
{
arr[end + gap] = arr[end];
end -= gap;
}
else
{
break;
}
}
arr[end + gap] = temp; //以 end+gap 作为插入位置
}
}
}