排序
插入排序
有如下的数组::
要将它从大到小来排放: 下标为end+1 的就是要插入. end指向倒数第二个
于是arr[end+1] = arr[end]; 不断的end–,前面的值不断的覆盖后面的值。
当end指向-1的时候已经退出循环,因此循环的条件end>=0;
然而此时end = -1,end+1 = 0,因此给arr[end+1] = 插入的值。这是单趟的逻辑,从整体来看,要添加一个循环,循环的结束条件:<n-1;(因为最后一个是将要插入的,根据数组的 下标,最后一个是n-1,)
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void Insertsort(int* arr, int n)
{
for (int end = 0; end < n - 1; ++end)
{
//先写单趟的
int temp = arr[end + 1];
while (end >= 0)//从小到大排序
{
if (arr[end] > temp)
{
arr[end + 1] = arr[end];
end--;
}
else {
break;//如果不是直接跳出循环
}
}
arr[end + 1] = temp;
}
}
int main(void)
{
int arr[5] = { 1,3,7,8,4 };
Insertsort(arr, 5);
for (int x = 0; x < 5; ++x)
{
printf("%d", arr[x]);
}
}
希尔排序
希尔排序实际上是对插入排序的进行分组,每gap个为一组,当gap为1的时候就是插入排序
如图所示:5 , 0 ,6 为一组,1,2为一组.
gap = 2;
还是先用单趟排序,将5,0,6一个个的插入,接着用for循环将后面的一个个插入
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void ShellSort(int* arr, int n)
{
int gap = n;
while (gap > 1)
{
gap /= 2; //当一个数除以2的时候这个数必定为1;
for (int end = 0; end < n - gap; ++end)
{
int temp = arr[end + gap];//这里的arr[end+gap],就是隔gap
while (end >= 0) //进行单趟排序,从小到大
{
if (arr[end] > temp)
{
arr[end + gap] = arr[end]; end -= gap;
}
else {
break;
}
}
arr[end + gap] = temp;
}
}
}
int main(void)
{
int arr[5] = { 5,1,0,2,6 };
ShellSort(arr, 5);
for (int x = 0; x < 5; ++x)
{
printf("%d", arr[x]);
}
}