二级C语言排序技术2

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二级C语言排序技术2相关的知识,希望对你有一定的参考价值。

参考技术A (1)交换类排序法

交换类排序法是指借助数据元素之间的互相交换进行排序的一种方法。冒泡排序法与快速排序法都属于交换类排序方法。

冒泡排序法是一种最简单的交换类排序方法,它是通过相邻数据元素的交换逐步将线性表变成有序。假设线性表的长度为n,则在最坏情况下,冒泡排序需要经过n/2遍的从前往后的扫描和n/2遍的从后往前的扫描,需要的比较次数为n(n–1)/2。但这个工作量不是必需的,一般情况下要小于这个工作量。

快速排序法也是一种交换类的排序方法,但由于它比冒泡排序法的速度快,因此称之为快速排序法。其关键是对线性表进行分割,以及对各分割出的子表再进行分割。

(2)插入类排序法

插入类排序法主要有简单插入排序法和希尔排序法。

简单插入排序法,是指将无序序列中的各元素依次插入到已经有序的线性表中。在这种排序方法中,每一次比较后最多移掉一个逆序,因此,这种排序方法的效率与冒泡排序法相同。在最坏情况下,简单插入排序需要n(n–1)/2次比较。

希尔排序法对简单插入排序做了较大的改进。它是将整个无序序列分割成若干小的子序列分别进行插入排序。希尔排序的效率与所选取的增量序列有关。在最坏情况下,希尔排序所需要的比较次数为O(n
1.5
)。

(3)选择类排序

选择类排序主要有简单选择类排序法和堆排序法。

简单选择排序法的基本思想是:扫描整个线性表,从中选出最小的元素,将它交换到表的最前面(这是它应有的位置);然后对剩下的子表采用同样的方法,直到子表空为止。对于长度为n的线性表,在最坏情况下需要比较n(n–1)/2次。

堆排序法也属于选择类排序法。具有n个元素的序列(h
1
,
h
2
,
…,
h
n
),当且仅当满足条件:



(i=1,
2,
…,
n/2)时称之为堆。可见,堆顶元素(即第一个元素)必为最大项。

堆排序的方法对于规模较小的线性表并不适合,但对于较大规模的线性表来说是很有效的。在最坏情况下,堆排序需要比较的次数为O(nlog
2
n
)。

C 语言二级指针作为输入 ( 指针数组 | 指针数组排序 | 字符串排序 | strcmp 函数 )





一、strcmp 函数



strcmp 是 String Compare 缩写 , 该函数用于比较两个字符串 ;

strcmp 函数 :

#include <string.h>
 int __cdecl strcmp(const char *_Str1,const char *_Str2);
  • _Str1 < _Str2 : 返回负数 ;
  • _Str1 = _Str2 : 返回0 ;
  • _Str1 > _Str2 : 返回正数 ;




二、指针数组排序 ( 字符串排序 )



指针数组 中的每个元素都是 指向 字符串的指针 , 通过 strcmp 函数对字符串进行排序 , 代码如下 :

    // 对 指针数组 进行排序 , 排序依据是 指针 指向的数据对比
    for(i = 0; i < num; i++)
    
        for(j = i; j < num; j++)
        
            // 核心逻辑 : 如果 array[i] 大于 array[j]
            //          就交换两个元素
            if(strcmp(array[i], array[j]) > 0)
            
                // 交换 i, j 位置的指针变量
                tmp = array[i];
                array[i] = array[j];
                array[j] = tmp;
            
        
    

上述代码是将字符串有小到大进行排序 ;





二、完整代码示例



代码示例 :

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



void main()

    // 循环控制变量
    int i = 0, j = 0;
    // 数组大小
    int num = 0;
    // 排序时 , 交换指针变量时的临时变量
    char *tmp;

    /*
     * 复杂指针阅读
     * 参考 https://blog.csdn.net/shulianghan/article/details/121453520 和
     * https://hanshuliang.blog.csdn.net/article/details/78568351#3____________________2803
     * 博客章节进行阅读
     *
     * 复杂指针解析流程 :
     * 1. 中心标识符是 array
     * 2. 先往右看 , 遇到 [] , 说明这是一个数组 , 挖掉 array[] 内容 , 然后调转方向往左看
     * 3. 发现是 * , 说明数组中的元素是指针 , 挖掉 * , 往右看没内容 , 往左看
     * 4. 发现是 char , 说明指针指向的数据是 char 类型
     *
     * array 是一个数组 , 数组中的元素的 char * 字符串
     *
     * 这是 指针数组 , 数组元素 是 指针
     */
    char *array[] = "abc", "123", "258", "sfd";

    // 计算数组大小
    num = sizeof(array) / sizeof(array[0]);

    // 打印上述数组
    for(i = 0; i < num; i++)
    
        // 使用 数组下标 与 指针 进行遍历 , 效果相同
        //printf("%s\\n", array[i]);
        printf("%s\\n", *(array + i));
    

    // 对 指针数组 进行排序 , 排序依据是 指针 指向的数据对比
    for(i = 0; i < num; i++)
    
        for(j = i; j < num; j++)
        
            // 核心逻辑 : 如果 array[i] 大于 array[j]
            //          就交换两个元素
            if(strcmp(array[i], array[j]) > 0)
            
                // 交换 i, j 位置的指针变量
                tmp = array[i];
                array[i] = array[j];
                array[j] = tmp;
            
        
    

    // 打印排序后的数组
    printf("\\nSort:\\n");
    for(i = 0; i < num; i++)
    
        // 使用 数组下标 与 指针 进行遍历 , 效果相同
        printf("%s\\n", array[i]);
        //printf("%s\\n", *(array + i));
    


    // 命令行不要退出
    system("pause");
    return;

执行结果 :

以上是关于二级C语言排序技术2的主要内容,如果未能解决你的问题,请参考以下文章

C 语言二级指针作为输入 ( 自定义二级指针内存 | 二级指针排序 | 通过 交换指针指向的内存数据 方式进行排序 )

计算机C语言中关于比较排序的问题

计算机二级C语言公共基础知识,以及习题总结查找和排序

C 语言二级指针作为输入 ( 自定义二级指针内存 | 二级指针排序 | 抽象业务逻辑函数 )

C 语言二级指针作为输入 ( 指针数组 | 指针数组排序 | 字符串排序 | strcmp 函数 )

C 语言二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一二 模型数据拷贝到 三 模型中 并 排序 )