首页 > 其他分享 >C语言:排序(1)

C语言:排序(1)

时间:2024-09-30 22:49:32浏览次数:9  
标签:插入排序 元素 C语言 希尔 array 排序 复杂度

目录

一、排序的概念及应用

排序的概念

排序的运用

 二、常见排序算法

插入排序

基本思想

直接插入排序

希尔排序( 缩小增量排序 )

选择排序

基本思想

堆排序


一、排序的概念及应用

排序的概念

排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。

稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次 序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排 序算法是稳定的;否则称为不稳定的。

内部排序:数据元素全部放在内存中的排序。

外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不断地在内外存之间移动数据的排序。

排序的运用

     类似于淘宝、京东这种商品排列就是用到了排序算法。

 二、常见排序算法

插入排序

基本思想

    直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为 止,得到一个新的有序序列 。

 实际中我们玩扑克牌时,就用了插入排序的思想

 

直接插入排序

    当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与 array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移

直接插入排序的特性总结:

1. 元素集合越接近有序,直接插入排序算法的时间效率越高

2. 时间复杂度:O(N^2)

3. 空间复杂度:O(1),它是一种稳定的排序算法

4. 稳定性:稳定  

希尔排序( 缩小增量排序 )

    希尔排序法又称缩小增量法,希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个 组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工 作。当到达=1时,所有记录在统一组内排好序。

希尔排序的特性总结:

1. 希尔排序是对直接插入排序的优化。

2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就 会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。

3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些树中给出的 希尔排序的时间复杂度都不固定

4. 稳定性:不稳定

选择排序

基本思想

  每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。

直接选择排序

在元素集合array[i]--array[n-1]中选择关键码最大(小)的数据元素

若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换

在剩余的array[i]--array[n-2](array[i+1]--array[n-1])集合中,重复上述步骤,直到集合剩余1个元素

 直接选择排序的特性总结:

1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用

2. 时间复杂度:O(N^2)

3. 空间复杂度:O(1)

4. 稳定性:不稳定

堆排序

    堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种,它是 通过堆来进行选择数据,需要注意的是排升序要建大堆,排降序建小堆。

 直接选择排序的特性总结:

1. 堆排序使用堆来选数,效率就高了很多。

2. 时间复杂度:O(N*logN)

3. 空间复杂度:O(1)

4. 稳定性:不稳定


       本篇内容就先到这里,后续会继续写关于排序的内容,希望对各位有帮助,如果有错欢迎指出。

标签:插入排序,元素,C语言,希尔,array,排序,复杂度
From: https://blog.csdn.net/2401_86551514/article/details/142638321

相关文章

  • C语言1—100的数字炸弹小游戏
    #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> #include<stdlib.h>#include<time.h>void menu(){printf("1=开始游戏\n");printf("0=不进行游戏\n");printf("请选择:");}void game(){int num=rand()%100+1; int inp......
  • python实现归并排序
    归并排序是把数组分为两半,两半再继续细分为小的数组,小数组完成各自排序后,分别合并为几个比较大的数组并完成内部排序,最后合并为一个数组,这时候基本排序是有序的。代码如下data=[6,15,4,2,8,5,11,9,7,13] defmerge_sort(data):  iflen(data)<=1:    return......
  • C语言学习记录
     9.24号b站上学习了swich条件语句和while循环语句9.25号【四舍五入】#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){floata=0;scanf("%f",&a);floatb=0;b=a;if(0<a){while(a>1......
  • 一文带你搞清C语言文件操作
    根据数据组织形式,文件分为文本文件或二进制文件在内存中以二进制的形式存储,不加转换输出到外存的文件中,就是二进制文件如果在外存上要以ASCII码形式存储,则需要在存储前转换,这种方式存储的文件就是文本文件一、流和标准流1、流流是一个抽象的概念。我们需要从外部获取数据,......
  • 实现C语言通讯录
    #实现C语言通讯录简简单单写一个C语言一:函数的定义通过MAX,NAME_MAX,SEX_MAX,ADDR_MX,TETE_MAX定义结构体成员的数量通过typedef重命名结构体为PeoInfo;在定义结构体structContact的PeoInfodata用来存放结构体里面人的信息和通过sz来访问人的信息#pragmaonce//人的信......
  • C语言文件操作(续写)
    文章目录C语言文件操作(续写)文件的随机读写fseekftellrewind文件结束判定被错误使用的feof二进制文件的例子:C语言文件操作(续写)文件的随机读写fseek根据文件指针的位置和偏移量来定位文件指针。#include<stdio.h>intmain(){FILE*pFile;pFi......
  • 鹏哥C语言54.一维数组(知识点)
    1.1一维数组的创建✌️✌️✌️ 举个例子:! 1.2数组的初始化 特别注意上面第6个,arr6[]实际上算是arr6[7]因为字符串末尾默认放了一个\0......
  • c语言第六章2.0
    题3,求一个3*3矩阵对角线之和#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>intmain(){   intstr[3][3];   for(inti=0;i<3;i++){      for(intj=0;j<3;j++){         str[i][j]=rand();//生......
  • 3805 谁拿了最多的奖学金 结构体排序
    解决思路 定义结构体:定义一个结构体 Student 来存储每个学生的信息和奖金总数。 读取输入:读取每个学生的信息,并计算每个学生的奖金总数。 3. 排序:根据奖金总数对学生进行排序,如果奖金总数相同,则按输入顺序排序。 输出结果:输出获得最多奖金的学生的姓名、奖金......
  • 2998 分数线划定 结构体排序
    解决思路 读取输入:读取选手数量 n 和计划录取人数 m,以及每个选手的报名号和笔试成绩。 排序:根据笔试成绩对选手进行排序,如果成绩相同,则按报名号由小到大排序。 确定面试分数线:计算 m*1.5(向下取整)名选手的分数作为面试分数线。 筛选进入面试的选手:筛选出......