数据结构 --- 排序算法(1)

这里都是按照升序排序的;
交换函数如下:

void Swap(int *a ,int *b){
    int tmp = *a;
    *a = *b;
    *b = tmp;
    return;
}
1.冒泡排序

方法一:首先,常规冒泡算法,外循环定义count 为排序的趟数,内循环为每趟进行比较并且交换,实现代码如下:

void BubbleSort(int array[],size_t size){
    if(size <= 1){
        return;
    }
    size_t count = 0;
    for(;count < size - 1;count++){
        size_t i = 0;
        for(i = 0;i < size - count -1;i++){
            if(array[i] > array[i+1]){
                Swap(&array[i],&array[i+1]);
            }
        }
    }//for(;count < size - 1;count++)
    return;
}

方法二:定义一个边界bound,并且[0,bound)为有序区间,[bound,size)为待排序区间,代码实现如下:

void BubbleSort2(int array[],size_t size){
    if(size <= 1){
        return;
    }
    //[0,bound)为一个有序区间
    //[bound,size)为待排序区间
    size_t bound = 0;
    for(;bound < size;bound++){
        size_t cur = size - 1;
        for(;cur > bound;cur--){
            if(array[cur] < array[cur - 1]){
                Swap(&array[cur],&array[cur - 1]);
            }
        }
    }
    return;
}

冒泡排序的时间复杂度:O(N^2)
空间复杂度:O(1)
稳定性:稳定排序算法

2.选择排序

思路:整体思路为打擂台,定义第一个元素为擂主即bound,然后让bound之后每一个元素与bound进行比较,如果bound大于后面的元素就进行交换(升序排序);
代码实现如下:

void SelectSort(int array[],size_t size){
    if(size <= 1){
        return;
    }
    size_t bound = 0;
    for(;bound < size;bound++){
        size_t cur = bound + 1;
        for(;cur < size;cur++){
            if(array[cur] < array[bound]){
                Swap(&array[cur],&array[bound]);
            }
        }
    }
    return;
}

选择排序时间复杂度:O(N^2)
空间复杂度:O(1)
稳定性:不稳定

3.插入排序

思路:定义一个边界bound,[0,bound)为有序区间,将这个有序区间看成线性表,
[bound,size)为待排序区间,在定义一个cur从后往前开始一边进行比较一边进行搬运,将bound_value的值插入到线性表的合适位置,这里需要注意的是,在搬运之前,先将bound的值保存起来,避免搬运之后将其覆盖;
代码实现如下:

void InsertSort(int array[],size_t size){
    if(size <= 1){
        return;
    }
    size_t bound = 1;
    for(;bound < size;bound++){
        int bound_value = array[bound];
        size_t cur = bound;
        for(;cur > 0;cur--){
            if(bound_value < array[cur - 1]){
                array[cur] = array[cur -1];
            }else{
                //说明已经找到一个合适的位置
                break;
            }
        }//for(;cur > 0;cur--)
        array[cur] = bound_value;
    }
    return;
}

插入排序的时间复杂度:O(N^2)
空间复杂度:O(1)
稳定性:稳定的排序算法
特点:
1.数组元素个数比较小的时候,执行效率比较快
2.如果数组基本有序,执行效率也很快

4.堆排序

思路:整体思路为两步
(1).根据数组建立堆(如果是升序排序,建立大堆);
有两种建立堆的方法:下沉式调整和上浮式调整;
这里两种方法都有实现,具体看代码
(2).循环的删除堆顶元素,删除完之后,排序也就完成了;
先将堆顶元素与最后一个元素进行交换,然后调用下沉式调整进行调整,使仍然符合堆的要求;
代码实现:
代码解释:从HeapSort函数开始;

void AdjustUp(int array[],size_t size,size_t index){
    (void)size;
    size_t child = index;
    size_t parent = (child - 1)/2;
    while(child > 0){
        if(array[parent] < array[child]){
            Swap(&array[parent],&array[child]);
        }else{
            break;
        }
        child = parent;
        parent = (child - 1)/2;
    }
    return;
}
void AdjustDown(int array[],size_t size,size_t index){
    size_t parent = index;
    size_t child = 2 * parent + 1;
    while(child < size){
        if(child + 1 < size && array[child] < array[child + 1]){
            child = child + 1;
        }
        if(array[parent] < array[child]){
            Swap(&array[parent],&array[child]);
        }
        parent = child;
        child = 2 * parent + 1;
    }
    return;
}
void HeapCreate(int array[],size_t size){
    if(size <= 1){
        return;
    }
#if 1
    //下沉式调整
    size_t i = (size - 1 -1)/2;
    for(;i > 0;i--){
        AdjustDown(array,size,i);
    }
    AdjustDown(array,size,0);
#else
    //上浮式调整
    size_t bound = 0;
    for(;bound < size;bound++){
        AdjustUp(array,bound,bound);
    }
#endif
    return;
}
void HeapPop(int array[],size_t heap_size){
    if(heap_size <= 1){
        return;
    }
    Swap(&array[0],&array[heap_size - 1]);
    AdjustDown(array,heap_size - 1,0);
    return;
}
void HeapSort(int array[],size_t size){
    if(size <= 1){
        return;
    }
    //1.基于数组建立一个堆(如果是升序排序,建立大堆)
    HeapCreate(array,size);
    //2.循环的删除堆顶元素,将所有的堆顶元素都删除完了,排序完成
    size_t i = 0;
    for(;i < size - 1;i++){
        //第二个参数表示数组中那部分区间是符合堆的规则
        HeapPop(array,size - i);
    }
    return;
}

堆排序时间复杂度:O(N*logN)
空间复杂度:O(1)
稳定性:不稳定排序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
后台采用apache服务器下的cgi处理c语言做微信小程序后台逻辑的脚本映射。PC端的服务器和客户端都是基于c语言写的。采用mysql数据库进行用户数据和聊天记录的存储。.zip C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
十大经典排序算法是指在计算机科学中常用的排序算法,它们分别是: 1. 冒泡排序(Bubble Sort):重复地比较相邻的两个元素,将较大的元素逐渐向右移动。 2. 选择排序(Selection Sort):每次从未排序的部分选择最小(或最大)的元素,并放在已排序的部分的末尾。 3. 插入排序(Insertion Sort):将未排序的元素逐个插入到已排序的部分中的正确位置。 4. 希尔排序(Shell Sort):将待排序的数组按照一定步长进行分组,对每组进行插入排序,逐渐减小步长。 5. 归并排序(Merge Sort):将待排序的数组递归地分成两半,对每一半进行排序,然后合并两个有序数组。 6. 快速排序(Quick Sort):选择一个基准元素,将数组划分为两部分,左边部分都小于基准,右边部分都大于基准,递归地对两部分进行排序。 7. 堆排序(Heap Sort):将待排序的数组构建成一个最大堆(或最小堆),然后依次取出堆顶元素并调整堆结构。 8. 计数排序(Counting Sort):统计数组中每个元素出现的次数,然后根据统计结果对元素进行排序。 9. 桶排序(Bucket Sort):将待排序的数组划分为多个桶,对每个桶中的元素进行排序,最后将桶中的元素按顺序合并。 10. 基数排序(Radix Sort):按照元素的位数,将待排序的数组从低位到高位进行排序。 以上是十大经典排序算法,每种算法都有其适用的场景和性能特点,选择合适的排序算法可以提高程序的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值