C语言排序算法

一、直接插入排序

        C语言中的直接排序通常指的是直接插入排序(Insertion Sort),这是一种简单直观的排序算法。它的基本思想是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增加1的有序表。这个算法是稳定的,也就是说,相等的元素的相对顺序不会在排序过程中改变。

插入排序步骤如下:

1、从第一个元素开始,该元素可以认为已经被排序。

2、取出下一个元素,在已经排序的元素序列中从后向前扫描。

3、如果该元素(已排序)大于新元素,将该元素移到下一位置。

4、重复步骤3,直到找到已排序的元素小于或者等于新元素的位置。

5、将新元素插入到该位置后。

6、重复步骤2~5。

代码示例如下:

特点:

二、冒泡排序

        冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行直到没有再需要交换,也就是说该数列已经排序完成。

冒泡排序步骤如下:

  1. 开始排序:首先,我们假设待排序的数组从第一个元素到最后一个元素都是无序的。

  2. 比较相邻元素:从数组的第一个元素开始,比较相邻的元素对(比如第一个和第二个元素,第二个和第三个元素,依此类推)。

  3. 交换元素:如果发现相邻元素的顺序错误(即前一个元素大于后一个元素),则交换它们的位置。

  4. 重复步骤2和3:继续对数组中的元素进行两两比较和交换,直到到达数组的最后一个元素。这完成了数组的第一轮“冒泡”。

  5. 重复整个流程:第一轮“冒泡”完成后,最大的元素会被“冒”到数组的最后位置。接下来,重复步骤2到4,但这次只处理数组的前n−1个元素(因为最后一个元素已经是最大的了)。

  6. 减少比较范围:每一轮“冒泡”后,最大的元素都会被放到正确的位置,因此每进行一轮,就减少一次比较的范围。

  7. 结束条件:当进行到某一轮,没有发生任何交换时,说明数组已经完全有序,此时可以结束排序。

  8. 输出排序结果:最后,输出或返回排序后的数组。
    代码如下

    特点:

三、选择排序

        选择排序选择排序是一种简单直观的排序算法。它的工作原理是首先在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

选择排序步骤如下:

  1. 初始化:首先,设定一个指针指向数组的第一个元素,这个指针将用来遍历数组。

  2. 寻找最小元素:从数组的当前指针位置开始,向后遍历数组,寻找最小(或最大,取决于排序顺序)的元素。这个过程中,会记录最小元素的索引。

  3. 交换元素:找到最小元素后,将其与当前指针指向的元素进行交换。这样做是因为我们希望将最小元素放到已排序部分的起始位置。

  4. 移动指针:将指针向后移动一位,指向下一个待排序的元素。

  5. 重复寻找和交换:重复步骤2到4,但这次是从指针当前位置到数组末尾的子数组中寻找最小元素,并与指针指向的元素交换。

  6. 缩小排序范围:每完成一次最小元素的寻找和交换,已排序的元素数量就增加一个,因此下一次寻找最小元素的范围就缩小了。

  7. 结束条件:当指针移动到数组的最后一个元素时,整个数组已经排序完成。

  8. 输出结果:最后,输出或返回排序后的数组。
    代码如下:

    特点:

四、快速排序
        快速排序(Quick Sort)是一种高效的排序算法,采用分治法(Divide and Conquer)策略来对一个数组进行排序。

快速排序步骤如下:

  1. 选择基准值:从数组中选择一个元素,称为"基准"(pivot)。
  2. 分区过程:重新排列数组,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数组的中间位置。这个称为分区(partition)操作。
  3. 递归排序:递归地将小于基准值元素的子数组和大于基准值元素的子数组排序。

    代码如下:

    特点:

五、归并排序

归并排序(Merge Sort)是一种有效的排序算法,采用分治法(Divide and Conquer)的一个典型应用。它将数组分成两半,对每一半进行排序,然后将排序好的两半合并在一起,最终得到一个有序的数组。

归并排序步骤:

  1. 分解:将当前数组分成两半,直到每一半只有一个元素,即数组不可再分。
  2. 合并:将两个有序的子数组合并成一个更大的有序数组。
  3. 递归:递归地对子数组进行分解和合并,直到整个数组都被排序。

    代码示例如下:

    特点:
     

六、希尔排序

        希尔排序(Shell Sort)是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。也使用分治法(Divide and Conquer)的一个应用。它与直接插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序是将数组分成若干子序列,这些子序列的元素间隔某个“增量”(gap),对每个子序列分别进行插入排序,随着增量逐渐减少,整个序列最终变为有序。

希尔排序步骤如下:

  1. 选择增量:选择一个增量 gap,通常选择数组长度的一半,直到 gap 为 1。
  2. 对子序列进行插入排序:对间隔为 gap 的子序列进行插入排序。
  3. 减小增量:减小增量 gap,再次对子序列进行插入排序。
  4. 重复步骤:重复步骤 2 和 3,直到 gap 减小到 1,此时整个数组已经接近有序。
  5. 最终插入排序:当增量 gap 减小到 1 时,整个数组进行一次插入排序,完成排序。

    代码示例如下:


特点:

七、堆排序

        堆排序(Heap Sort)是一种基于比较的排序算法,它使用二叉堆数据结构来排序元素。堆是一个满足以下性质的完全二叉树:对于最大堆,父节点的值总是大于或等于它的子节点的值;对于最小堆,父节点的值总是小于或等于它的子节点的值。

堆排序步骤如下:

  1. 建立最大堆:将无序输入数组构建成一个最大堆,这样最大的元素就是堆顶元素。
  2. 交换堆顶元素:将堆顶元素与数组最后一个元素交换,此时数组的最后部分是有序的。
  3. 重新调整堆:移除堆顶元素后,需要重新调整剩余元素,使其再次成为最大堆。
  4. 重复交换和调整:重复步骤2和3,每次交换后减少堆的大小,直到整个数组有序。

    代码如下:

    特点;

八、计数排序

        计数排序(Counting Sort)是一种非比较型整数排序算法,适用于一定范围内的整数排序。它不是基于比较的算法,因此它的时间复杂度不依赖于数据的初始状态,其时间复杂度为 O(n+k)O(n+k),其中 nn 是数组的长度,kk 是数值的范围。

计数排序步骤如下:

  1. 找出数组中最大和最小的元素:确定排序的数值范围。
  2. 创建计数数组:初始化计数数组,数组的索引对应输入数组的数值,数组的值表示该数值在输入数组中出现的次数。
  3. 填充计数数组:遍历输入数组,对每个元素的计数加一。
  4. 累加计数:将计数数组中的每个元素进行累加,累加值表示当前数值在排序后数组中的最终位置。
  5. 构建输出数组:根据计数数组构建输出数组,对于输入数组中的每个元素,从计数数组中找到它的位置,并将计数减一。
  6. 复制到原数组:将输出数组复制到原数组,完成排序。

    代码如下:

    特点:

  • 11
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值