秩序的构建:探寻排序算法的奥秘,开启数据世界的诗篇

ops/2024/10/22 15:40:49/

目录

一、排序算法的基本概念

二、常见排序算法的运行方式和 C 语言实现

1. 冒泡排序

2. 选择排序

3. 插入排序

4. 归并排序

5. 快速排序

三、排序算法的深度分析

1. 时间复杂度

2. 空间复杂度

3. 稳定性

四、总结

五、其他


一、排序算法的基本概念

排序算法是指将一组无序的数据元素按照特定的顺序进行排列的过程。常见的排序算法有:

  • 冒泡排序 (Bubble Sort):通过比较相邻元素,将较大的元素交换到后面,逐次遍历整个数组,直到数组有序。

  • 选择排序 (Selection Sort):在未排序的数组中找到最小元素,将其与第一个元素交换位置,然后在剩余未排序的数组中继续寻找最小元素,并与第二个元素交换位置,以此类推。

  • 插入排序 (Insertion Sort):将数组分为已排序和未排序两个部分,每次从未排序部分中取出第一个元素,将其插入到已排序部分的合适位置,直到所有元素都排序完毕。

  • 归并排序 (Merge Sort):将数组递归地分成两半,直到每个子数组只有一个元素,然后将两个有序子数组合并成一个有序数组。

  • 快速排序 (Quick Sort):选择一个基准元素,将数组中比基准元素小的元素放在基准元素的左边,比基准元素大的元素放在基准元素的右边,然后递归地对左右两部分进行排序。

二、常见排序算法的运行方式和 C 语言实现

1. 冒泡排序

  • 运行方式:

    • 比较相邻元素,如果顺序错误则交换。

    • 遍历数组,重复比较和交换,直到没有元素需要交换。

  • C 语言实现:

    void bubbleSort(int arr[], int n) 
    {int i, j, temp;for (i = 0; i < n - 1; i++) {for (j = 0; j < n - i - 1; j++) {if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
    }
    

    流程图:

2. 选择排序

  • 运行方式:

    • 找到未排序数组中的最小元素。

    • 将最小元素与第一个元素交换位置。

    • 重复上述步骤,直到所有元素都排序完毕。

  • C 语言实现:

    void selectionSort(int arr[], int n) 
    {int i, j, minIndex, temp;for (i = 0; i < n - 1; i++) {minIndex = i;for (j = i + 1; j < n; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}temp = arr[minIndex];arr[minIndex] = arr[i];arr[i] = temp;}
    }
    

    流程图:

3. 插入排序

  • 运行方式:

    • 将第一个元素视为已排序数组。

    • 从第二个元素开始,每次将一个元素插入到已排序数组中的合适位置。

  • C 语言实现:

    void insertionSort(int arr[], int n) 
    {int i, j, key;for (i = 1; i < n; i++) {key = arr[i];j = i - 1;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}arr[j + 1] = key;}
    }
    

    流程图:

4. 归并排序

  • 运行方式:

    • 将数组递归地分成两半,直到每个子数组只有一个元素。

    • 将两个有序子数组合并成一个有序数组。

  • C 语言实现:

    void merge(int arr[], int left, int mid, int right) 
    {int n1 = mid - left + 1;int n2 = right - mid;int L[n1], R[n2];int i, j, k;for (i = 0; i < n1; i++) {L[i] = arr[left + i];}for (j = 0; j < n2; j++) {R[j] = arr[mid + 1 + j];}i = 0;j = 0;k = left;while (i < n1 && j < n2) {if (L[i] <= R[j]) {arr[k] = L[i];i++;} else {arr[k] = R[j];j++;}k++;}while (i < n1) {arr[k] = L[i];i++;k++;}while (j < n2) {arr[k] = R[j];j++;k++;}
    }void mergeSort(int arr[], int left, int right) 
    {if (left < right) {int mid = left + (right - left) / 2;mergeSort(arr, left, mid);mergeSort(arr, mid + 1, right);merge(arr, left, mid, right);}
    }
    

    流程图:

5. 快速排序

  • 运行方式:

    • 选择一个基准元素。

    • 将数组中比基准元素小的元素放在基准元素的左边,比基准元素大的元素放在基准元素的右边。

    • 递归地对左右两部分进行排序。

  • C 语言实现:

    int partition(int arr[], int low, int high) 
    {int pivot = arr[high];int i = (low - 1);for (int j = low; j <= high - 1; j++) {if (arr[j] < pivot) {i++;swap(arr, i, j);}}swap(arr, i + 1, high);return (i + 1);
    }void quickSort(int arr[], int low, int high) 
    {if (low < high) {int pi = partition(arr, low, high);quickSort(arr, low, pi - 1);quickSort(arr, pi + 1, high);}
    }void swap(int arr[], int i, int j) 
    {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;
    }
    

    流程图:

三、排序算法的深度分析

1. 时间复杂度

  • 冒泡排序、选择排序和插入排序的时间复杂度都是 O(n^2),这意味着它们的运行时间随着数据量的增加呈平方增长。

  • 归并排序和快速排序的时间复杂度都是 O(n log n),这意味着它们的运行时间随着数据量的增加呈线性增长。

2. 空间复杂度

  • 冒泡排序、选择排序和插入排序的空间复杂度都是 O(1),这意味着它们不需要额外的空间。

  • 归并排序的空间复杂度是 O(n),因为它需要额外的空间来存储合并后的数组。

  • 快速排序的空间复杂度是 O(log n),因为它需要递归调用。

3. 稳定性

  • 稳定排序算法是指在排序过程中,如果两个元素的值相等,它们的相对顺序不会改变。

  • 冒泡排序、插入排序和归并排序是稳定的排序算法

  • 选择排序和快速排序是不稳定的排序算法

四、总结

        不同的排序算法有不同的时间复杂度、空间复杂度和稳定性,适合不同的应用场景。对于小规模的数据集,冒泡排序、选择排序和插入排序就足够了。对于大规模的数据集,归并排序和快速排序是更好的选择。

五、其他

除了上面提到的排序算法,还有很多其他的排序算法,例如:

  • 堆排序 (Heap Sort)

  • 基数排序 (Radix Sort)

  • 桶排序 (Bucket Sort)

        选择合适的排序算法取决于具体的应用场景,需要根据数据量、数据分布、时间复杂度、空间复杂度和稳定性等因素进行权衡。


http://www.ppmy.cn/ops/127604.html

相关文章

数字孪生城市:智慧城市的未来蓝图

在当今数字化时代&#xff0c;智能技术的广泛应用正在改变人们的生活和工作方式。数字孪生城市作为未来新型智慧城市演进的重要方向&#xff0c;数字孪生城市是一种将城市物理世界的各个方面转化为数字形式的技术&#xff0c;通过网络空间与物理世界之间的实时数据交换和仿真分…

界壁0.1

为了实现全面而强大的安全系统,我们进一步完善代码,确保每个功能模块都尽可能地健壮和高效。以下是一个更完善的版本,涵盖了所提到的功能: 功能概述 请求 root 权限:确保脚本以 root 权限运行。 配置防火墙规则:自动获取所需权限,配置 iptables 规则以记录和拦截流量。…

sqoop搭建教程

1.上传并解压 tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz2.修改配置文件 cd sqoop-1.4.6/conf/mv sqoop-env-template.sh sqoop-env.shvim sqoop-env.sh3.配置环境变量 vim /etc/profilesource /etc/profile4.添加jar包 cd /usr/local/soft/sqoop-1.4.6/lib

linux查看占用高进程所在目录

1.遇到的问题 服务器被攻击&#xff0c;nmon流量占用很高&#xff0c;可以使用如下命令查看应用所在目录 如果你想要查看特定进程的完整路径&#xff0c;可以使用以下命令&#xff1a; readlink -f /proc/<pid>/exe 2.解决办法 删掉文件&#xff0c;之后kill 掉这个进程…

初识适配器模式

适配器模式 引入 生活中的例子&#xff1a;当我们使用手机充电时&#xff0c;充电器起到了转换器的作用&#xff0c;它将家用的220伏特电压转换成适合手机充电的5伏特电压。 适配器模式的三种类型 命名原则&#xff1a;适配器的命名应基于资源如何传递给适配器来进行。 类适配…

开源软件简介

一、开源运动的发起 近几十年&#xff0c;软件已经称为战略性的社会资源。各大软件供应商传统的对外封锁源代码的运营模式虽说有积极的一面&#xff0c;比如可以维护开发商的利益&#xff0c;使其可以持续地维护进一步开发的能力&#xff0c;以及可以保护软件商及客户的私密信息…

品牌私域核心

想要解决产品和流量问题&#xff0c;关键就在于启动品牌私域。 1、流量池搭建 私域是指品牌拥有可重复、低成本甚至免费触达用户的场域&#xff0c;是线上线下一体化的品牌自主经营阵地&#xff0c;也是品牌自主发展、掌握客户关系、线上线下联动的新业态。‌ 对于品牌来说&…

《柬埔寨语翻译通》App:技术驱动的高棉语学习与翻译解决方案,无需打字对着说话就能识别翻译的工具!

柬埔寨&#xff0c;东南亚一个神秘国度&#xff0c;以其独特的文化和语言吸引着全球旅行者和语言爱好者。为了帮助用户克服语言障碍&#xff0c;我们推出了《柬埔寨语翻译通》App&#xff0c;一款集成了翻译、学习、旅游辅助功能的多功能语言工具。 技术亮点与功能特性&#xf…