插入排序(直接插入),希尔(shell)排序 算法实现(数据结构C语言版)

摘要:排序算法是必学的重点。今天 我们一起来看看直接插入排序和希尔排序是如何实现的。

        插入排序是把一个记录插入到已排序的有序序列中,使整个序列在插入该记录后仍然有序。插入排序中较简单的种方法是直接插入排序,其插入位置的确定方法是将待插入的记录与有序区中的各记录自右向左依次比较其关键字值的大小。本实例要求使用直接插入排序法将数字由小到大进行排序。

        直接插入排序算法代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>
int main()
{
	int a[8]={2,8,6,4,9,7,3,5};
	int i,j,tmp;
	for(i=1;i<8;i++)
	{
		tmp=a[i];
		for(j=i-1;j>=0;j--)
		{
			if(a[j]>tmp)
			{
				a[j+1]=a[j];				
			}
			else
			{
				break;
			}
		}
		a[j+1]=tmp;
	}
	for(i=0;i<8;i++)
	{
		printf("%d ",a[i]);
	}
	puts(" ");
	return 0;
}

       希尔排序其实是将直接插入排序算法优化后的算法,当数据量越大时,这种优化的效果会显著增强。效率会高上直接插入排序不少。

        希尔排序是将待排序的数组元素 按下标的一定增量分组 ,分成多个子序列,然后对各个子序列进行直接插入排序算法排序;然后依次缩减增量再进行排序,直到增量为1时,进行最后一次直接插入排序,排序结束。

希尔排序算法实现代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>
int main()
{
    int a[8] = {2,5,9,1,3,10,6,4};
    int i = 0;
    int j = 0;
    int tmp = 0;

    int d;//定义增量
    for(d = 8/2; d > 0; d/=2)//增量为所求长度的一半
    {
        for(i = d; i < 8; i++)
        {
            tmp = a[i];//设置基准
            for(j = i-d; j >= 0; j-=d)//逆序比较
            {
                if(a[j]>tmp)
                {
                    a[j+d] = a[j];
                }
                else
                {
                    break;
                }
            }
            a[j+d] = tmp;

        }
    }
    for(i = 0; i < 8; i++)
    {
        printf("%d ", a[i]);
    }
    puts(" ");

    return 0;
}

好了,今天就分享到这儿了,要去干饭了。有什么地方写的不对的欢迎大家指正,谢谢观看。

猜你喜欢

转载自blog.csdn.net/weixin_56187542/article/details/126148003