插入排序
#include <stdio.h>
void printA (int *a, int len)
{
int i;
for (i = 0; i < len; i++)
{
printf ("%-4d", a[i]);
}
printf ("\n");
}
//插入排序
int main()
{
int a[10] = {3,2,1,0,5,7,6,9,8,4};
int len = sizeof(a) / sizeof(a[0]);
int get; //抽牌
int i,j;
for (i = 1;i < len; i++)
{
get = a[i];
j = i - 1;
while (j >= 0 && a[j] > get) //找到插入位置
{
a[j+1] = a[j]; //后面的数向后移位
j--;
}
a[j+1] = get;
}
printA (a, len);
return 0;
}
二分插入排序(对插入排序的一些优化)
int main ()
{
int a[10] = {3,2,1,0,5,7,6,9,8,4};
int len = sizeof(a) / sizeof(a[0]);
int get,left,right,mid,i,j;
for (i = 1; i < len; i++)
{
get = a[i]; //抽牌
left = 0; //设置左边界
right = i - 1; //设置右边界
while (left <= right) //找到要插入的位置,left位置就是要插入的位置
{
mid = (left + right)/2;
if (a[mid] > get)
{
right = mid - 1; //重新设置右边界
}
else
{
left = mid + 1; //重新设置左边界
}
}
//把left位置和left往后的元素度向后移位
for (j = i - 1; j >= left; j--)
{
a[j + 1] = a[j];
}
a[left] = get; //把数插进去
}
printA (a , len);
return 0;
}
希尔排序
#include <stdio.h>
void printA (int *a, int len)
{
int i;
for (i = 0; i < len; i++)
{
printf ("%-4d", a[i]);
}
printf ("\n");
}
//希尔排序
int main1()
{
int a[10] = {3,2,1,0,5,7,6,9,8,4};
int len = sizeof(a) / sizeof(a[0]);
int get; //抽牌
int i,j;
int d; //增量递减 (每一次的步长)
d = len;
do
{
d = d / 3 + 1;
for (i = d; i < len; i++)
{
get = a[i];
j = i - d;
while (j >= 0 && a[j] > get)
{
a[j+d] = a[j];
j = j - d;
}
a[j+d] = get;
}
}while(d > 1); //这条件当d为1时也执行了一次
printA (a , len);
return 0;
}
//希尔排序又称增量递减排序
int main1()
{
int a[10] = {3,2,1,0,5,7,6,9,8,4};
int len = sizeof(a) / sizeof(a[0]);
int get; //抽牌
int i,j;
int d = 0; //增量递减 (每一次的步长)
while(d < len)
{
d = d * 3 + 1; //第一次d为 1 第二次d为4 第三次d为 13 循环结束
}
while(d > 0) //或者while(d >= 1)
{
for (i = d; i < len; i++) //第一次d为13 > len 不进入循环
{ //第二次d为4 循环
get = a[i]; //第三次d为1 循环
j = i - d;
while (j >= 0 && a[j] > get)
{
a[j+d] = a[j];
j = j - d;
}
a[j+d] = get;
}
d = (d - 1) / 3; //d第一次为4 d第二次为 1 d第三次为0退出while循环
}
printA (a , len);
return 0;
}