ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

渐增型算法:插入排序

2021-01-20 02:02:46  阅读:124  来源: 互联网

标签:数组 int 插入排序 渐增 算法 key array void size


渐增型算法:插入排序

源码参考《算法设计、分析与实现 徐子珊著》

一、算法说明

1、渐增型算法:作为算法的主体是一个循环,逐个处理输入数据,已经处理的部分为问题的解;即按顺序处理问题,当输入数据处理完,问题也就处理了。
2、算法特点:直观,时间复杂度不友好
3、个人理解:降低问题维度,将一维的输入数据转化成单个数据,能准确处理单个数据时,遍历整个输入数据即可。

二、插入排序算法

1、输入一个乱序的数组,使用插入排序算法,输出升序或者降序数组;
2、从乱序数组中,逐个取出元素,加入已经排序好的数组,保证新加入的元素不破坏当前数组排序;
3、将数组排序问题,转化成,单个元素有序插入已经排序数组问题;
4、问题初始状态:从原始数组中取出第一个元素,作为已排序的数组初始状态;
5、算法核心:单个元素插入已排序数组,从数组尾部比较,将数据后移,找到该元素对应位置。

三、代码实现

// V1:基础版本,功能正常;先用伪代码实现思路,便于思考;注意关键点的实现
int insertionSortV1(int *array, int len)
{
    int key, j;
    for (int i = 1; i < len; i++) {
        key = array[i];
        j = i;
        // 将key插入到已经排好序的array[j - 1]中,使array[j]有序;修改判断条件,可以控制顺序
        while (j > 0 && (array[j - 1] > key)) {
            array[j] = array[j -1];
            j--;
        }
        array[j] = key;
    }
    return 0;
}

四、使用指针优化,扩展通用性

1、指针使用说明:输入任意类型的数据,提供对应的比较函数,即可以实现排序,参考qsort。

2、比较函数实现:

// V2: 输入任意类型的数组,使用指针实现
int intGreater(void *x, void *y)
{
    // 需要先对指针类型进行强制转换
    return *(int *)x - *(int *)y;
}

int charGreater(void *x, void *y)
{
    // 需要先对指针类型进行强制转换
    return strcmp((char *)x, (char *)y);
}


3、算法优化实现:

int insertionSortV2(void *array, int len, int array_size, int (*cmp)(void *, void *))
{
    int j;
    // array_size 表示数组元素的大小
    void *key = (void *)malloc(array_size);
    memset(key, 0, array_size);

    for (int i = 1; i < len; i++) {
        // 利用指针取数
        key = memcpy(key, array + i * array_size, array_size);
        j = i;
        // 将key插入到已经排好序的array[j - 1]中,使array[j]有序
        while ((j > 0) && (cmp(key, array + (j - 1) * array_size) < 0)) {
            // 内存赋值,使用指针
            memcpy(array + j * array_size, array + (j - 1) * array_size, array_size);
            j--;
        }
        memcpy(array + j * array_size, key, array_size);
    }

    return 0;
}


五、测试代码


// 测试代码
int main(void)
{
    int array[ARRAY_LEN] = {9, 3, 2, 4, 6, 7, 1, 0, 5, 8};
    char array_char[ARRAY_LEN] = {'a', 'h', 'd', 's', 'c', 'W', 'l', 'M', 'Z', 'z'};
    int ret;

    // ret = insertionSortV1(array, ARRAY_LEN, sizeof(int), intGreater);
    ret = insertionSortV2(array_char, ARRAY_LEN, sizeof(char), charGreater);
    if (ret != 0) {
        printf(" insetion sort array failed.ret=%d\n", ret);
        goto out;
    }

    for (int i = 0; i < ARRAY_LEN; i++) {
        // printf("array[%d] = %d\n", i, array[i]);
        printf("array_char[%d] = %c\n", i, array_char[i]);
    }

out:
    while (1);
    return 0;
}

标签:数组,int,插入排序,渐增,算法,key,array,void,size
来源: https://www.cnblogs.com/HZL2017/p/14300857.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有