首页 > 其他分享 >交换排序:冒泡排序和快速排序的实现

交换排序:冒泡排序和快速排序的实现

时间:2023-08-25 16:57:58浏览次数:38  
标签:int series 交换 len 冒泡排序 printf 排序

冒泡排序

冒泡排序的定义:冒泡排序(Bubble Sort)是一种最简单的交换排序方法,它通过两两比较相邻记录的关键字,如果发生逆序,则进行交换,从而使关键字小的记录如气泡一般逐渐往上 “漂浮”(左移), 或者说使关键字大的记录如石块一样逐渐向下 “坠落”(右移)。

冒泡排序的代码

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

void bubble_sort(int serice[], int length)
{
    int flag = 1; // 用来标记某一趟排序是否发生交换
    int m = length - 1;

    while ((m > 0) && (flag == 1))
    {
        flag = 0; // flag置为0,如果本趟排序没有发生交换,则不会进行下一趟排序
        for (int j = 0; j <= m; j++)
        {
            if (serice[j] > serice[j+1])
            {
                flag = 1;
                /* 交换位置 */
                int temp = serice[j];
                serice[j] = serice[j+1];
                serice[j+1] = temp;
            }
        }
        m--;
    }
}

void print_series(const int series[], int len)
{
    for (int i = 0; i < len; i++)
    {
        printf("%d ", series[i]);
    }
    printf("\n");
}

int main(void)
{
    int series[] = {5, 7, 6, 8, 9, 2, 1, 4, 3};
    int len = sizeof(series) / sizeof(series[0]);

    // 排序前,打印
    printf("排序前,打印\n");
    print_series(series, len);

    // 冒泡排序
    bubble_sort(series, len);

    // 排序后,打印
    printf("排序后,打印\n");
    print_series(series, len);

    return 0;
}

每一轮循环下来,每一个最大值都会排到最右侧,然后最大值不再参与下一轮的排序。

快速排序

快速排序的定义:快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为较小和较大的2个子序列,然后递归地排序两个子序列

快速排序的代码实现:

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

/* 
 * @param series表示一个一维整型数组
 * @param low表示数组下标
 * @param high表示数组下标
 * 对于传入的形参low和high来说,要求满足low < high
 */

void quick_sort(int series[], int low, int high)
{
   if (low < high)
   {
        int i = low;
        int j = high; 
        int x = series[low];

        while (i < j)
        {
            while (i < j && series[j] >= x) // 从右往左
                j--;
            if (i < j)
                series[i++] = series[j];
            while (i < j && series[i] < x) // 从左往右
                i++;
            if (i < j)
                series[j--] = series[i];
        }
        series[i] = x;
        quick_sort(series, low, i - 1);
        quick_sort(series, i + 1, high);
   }
}

void print_series(const int series[], int len)
{
    for (int i = 0; i < len; i++)
    {
        printf("%d ", series[i]);
    }
    printf("\n");
}

int main(void)
{
    int series[] = {5, 7, 6, 8, 9, 2, 1, 4, 3};
    int len = sizeof(series) / sizeof(series[0]);

    // 排序前,打印
    printf("排序前,打印\n");
    print_series(series, len);

    // 快速排序
    quick_sort(series, 0, 8);

    // 排序后,打印
    printf("排序后,打印\n");
    print_series(series, len);

    return 0;
}

取一个关键值(取待排序list的第一个值),把小于关键值的交换到左边,把大于等于关键值的交换到右边,。。。,把关键值放到中间位置。关键值不参与递归
把关键值左边的所有值递归执行,直到排序完成。把关键字右边的所有值递归执行,直到排序完成。

反思总结

冒泡排序

时间复杂度:O(\(n^2\))

空间复杂度:O(1)

算法特点:

1)稳定排序

2)可用于链式存储结构

3)移动记录次数较多。当初始记录无序,n较大时,此算法不推荐使用

快速排序

时间复杂度:O(\(nlog_2n\))

空间复杂度:O(\(log_2n\)) ~ O(\(n\))

算法特点:

1)记录非顺次的移动导致排序方法是不稳定的

2)需要确定界限,仅适合顺序结构

3)适合初始记录无序且n较大时的情况

参考引用

数据结构第二版:C语言版(严蔚敏)

标签:int,series,交换,len,冒泡排序,printf,排序
From: https://www.cnblogs.com/caojun97/p/17653504.html

相关文章

  • RK3588开发板编译环境Ubuntu20.04编译配置增加交换内存
    迅为提供的编译环境Ubuntu20.04默认配置了交换内存是9G,如果在编译过程中,因内存不够而编译报错,可以参考本小节进行设置。这里举例分配5G交换内存。在开始之前,使用命令检查一下您的ubuntu的swap分区。sudoswapon--show通过以下命令创建一个用于swap的文件sudofallocate......
  • 半导体企业如何进行跨网数据交换 ,又能保护核心数据安全性?
    为了保护设计文档、代码文件等内部核心数据,集成电路半导体企业一般会将内部隔离成多个网络,比如研发网、办公网、生产网、测试网等。常规采取的网络隔离手段如下:1、云桌面隔离:一方面实现数据不落地,终端数据安全有保障,另一方面,也可以实现内部数据不会轻易泄露到外部2、防火墙隔离:......
  • Leetcode1636——按照频率将数组升序排序
    给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序。如果有多个值的频率相同,请你按照数值本身将它们 降序 排序。 请你返回排序后的数组。 示例1:输入:nums=[1,1,2,2,2,3]输出:[3,1,1,2,2,2]解释:'3'频率为1,'1'频率为2,'2'频率为3。示例2:输入:nu......
  • DQL-排序查询
      年龄相同按日期降序排序 ......
  • 拓扑排序学习笔记
    思想拓扑,一看就是从图的开始开始开拓,并按被开拓到的顺序排序拓扑排序的思想如下:将入度为\(0\)的点删除,并记录它被删除的顺序,直到没有点则结束程序图解如本图的拓扑序就为123541.发现1入度为0删除1,2/3的入度减\(1\)2.发现2入度为0删除2,5的入度减\(1\)3.发现3......
  • LeetCode-24. 两两交换链表中的节点(Golang)
    一、前言作者:bug菌博客:CSDN、掘金、infoQ、51CTO等简介:CSDN/阿里云/华为云/51CTO博客专家,博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者,全网粉丝合计10w+,硬核微信公众号「猿圈奇妙屋」,免费领取简历模板/学习资料/大厂面试真题/职业规划......
  • 执行排序
    排序方式方法排序类排序Suite方法排序的类型类型说明OrderAnnotation(重点)@Order 注解指定排序DisplayName根据显示名称排序Random随机排序MethodName根据方法名称排序importorg.junit.jupiter.api.MethodOrderer.OrderAnnotation;importorg.ju......
  • 2064:【例2.1】交换值
    2064:【例2.1】交换值时间限制:1000ms      内存限制:65536KB提交数:114708   通过数:62617【题目描述】输入两个正整数a和b,试交换a、b的值(使a的值等于b,b的值等于a)。【输入】输入两个正整数a和b。【输出】输出a与b交换值后的结果。【输入样例】......
  • DAY003_选择排序、冒泡排序、插入排序
    选择排序第一遍遍历:从头开始,找到最小值的坐标,将最小值和数组第一个元素对调第二遍遍历:从第二个元素开始,找到最小值的坐标,将最小值和数组第二个元素对调第三遍遍历:从第三个元素开始,找到最小值的坐标,将最小值和数组第三个元素对调....冒泡排序第一遍遍历:只要前数比后数大就交......
  • 定义一个函数,传入一个字典和一个元组,将字典的值(key不变)和元组的值交换,返回交换后的
    知识点:zip()函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。li=[3,4,5]t=(7,8,9)print(list(zip(li,t)))print(dict(zip(li,t)))运行截图:例1:deff(a,b):print(a)print(b)#先获取对应的元素b......