排序---插入类排序

直接插入排序
方法:数据r[1]到r[i-1]是有序的,r[i]到r[n]是任意次序的。将r[i]插入到r[1]到r[i-1]中并使得r[1]到r[i]有序。i从2开始到结束进行n-1次。例
48 62 35 77 55 14 35 98
{48} 62 35 77 55 14 35 98
{48 62} 35 77 55 14 35 98
{35 48 62} 77 55 14 35 98
{35 48 62 77} 55 14 35 98
{35 48 55 62 77} 14 35 98
{14 35 48 55 62 77} 35 98
{14 35 35 48 55 62 77} 98
{14 35 35 48 55 62 77 98}

代码:

//插入排序
void InsertSort(int *arr, int length)
{
    for (int j = 1; j < length; j++)//循环
    {
        int key = arr[j];
        int j = j-1;

        while (i >= 0 && key <= arr[i])//判断是否满足插入条件
        {
            arr[i+1] = arr[i];
            i--;
        }

        arr[i+1] = key;
    }
}

希尔排序
算法思想:
(1)选定记录间的距离为d1在整个待排序记录序列中将所有间隔为d1的记录分成一组,进行组内直接插入排序;
(2)取记录间的距离为d2(d2 < d1),在整个待排序记录序列中,将所有间隔为d2的记录分成一组,进行组内直接插入排序;
(3)重复步骤2,直至记录间的距离d=1,此时整个只有一个子序列,对该序列进行直接插入排序,完成整个排序过程。例如:
初始: 49 38 65 97 76 13 27 48 55 4
取d = 5
一趟分组:
这里写图片描述
一趟排序: 13 27 48 55 4 49 38 65 97 76
取d = 3
二趟分组:
这里写图片描述
二趟排序:13 4 48 38 27 49 55 65 97 76
取d = 1
三趟排序:4 13 27 38 48 49 55 65 76 97

代码:

//希尔排序
void ShellSort(int *arr, int length)
{
    for (int d = 5; d > 0; d -= 2)//躺数,也可传参数
    {
        for (int i = d; i < length; i++)//要插入的次数
        {
            int key = arr[i];

            for (int j = i-d; j >= 0; j -= d)
            {
                if (key < arr[j])
                {
                    Swap(&arr[j+d], &arr[j]);
                }
                else
                {
                    break;
                }
            }
        }
    }
}

插入排序和希尔排序的实现:

#ifndef Sort_h__
#define Sort_h__

#include <stdio.h>
#include <stdlib.h>

//输出
void Show(int *arr, int length);

//交换
void Swap(int *num1, int *num2);

//插入排序
void InsertSort(int *arr, int length);//时间复杂度O(n^2),

//希尔排序
void ShellSort(int *arr, int length);

#endif // Sort_h__

以上函数的实现:

#include "Sort.h"

//输出
void Show(int *arr, int length)
{
    for (int i = 0; i < length; i++)
    {
        printf("%d,", arr[i]);
    }
    printf("\b \n");
}

//交换
void Swap(int *num1, int *num2)
{
    int temp = *num1;
    *num1 = *num2;
    *num2 = temp;
}

//插入排序
void InsertSort(int *arr, int length)
{
    for (int j = 1; j < length; j++)
    {
        int key = arr[j];
        int i = j-1;

        while (i >= 0 && key <= arr[i])
        {
            arr[i+1] = arr[i];
            i--;
        }

        arr[i+1] = key;
    }
}

//希尔排序
void ShellSort(int *arr, int length)
{
    for (int d = 5; d > 0; d -= 2)//躺数,也可传参数
    {
        for (int i = d; i < length; i++)//要插入的次数
        {
            int key = arr[i];

            for (int j = i-d; j >= 0; j -= d)
            {
                if (key < arr[j])
                {
                    Swap(&arr[j+d], &arr[j]);
                }
                else
                {
                    break;
                }
            }
        }
    }
}

测试代码:

#include "Sort.h"

int main(void)
{
    int arr[] = {9,8,7,6,5,4,3,2,34,56,74,90,5};
    int length = sizeof(arr)/sizeof(arr[0]);

    printf("----------没有排序---------\n");
    Show(arr, length);
#if 0
    printf("----------插入排序---------\n");
    InsertSort(arr, length);
    Show(arr, length);
#endif

    printf("----------希尔排序---------\n");
    ShellSort(arr, length);
    Show(arr, length);

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值