C语言数据结构编程练习-排序算法

news/2025/2/7 6:19:37/

1、冒泡排序

 思路:比较相邻的两个数,左边大于右边交换一趟排下来最大的在右边时间复杂度:O(n2)

//冒泡排序  从小到大的顺序排列
//思路:比较相邻的两个数,左边大于右边交换一趟排下来最大的在右边
void bubbleSort(int arr[],int length)
{for (int i = 0; i < length-1; i++)//比较的趟数:length-1趟{for (int j = 0; j < length - 1 - i; j++)//每趟比较的次数:length-1-i{if (arr[j] > arr[j + 1]){int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}

2、选择排序

思路:每次从待排序列中选出一个最小值,然后放在序列的起始位置,直到全部待排数据排完即可。
实际上,我们可以一趟选出两个值,一个最大值一个最小值,然后将其放在序列开头和末尾,这样可以使选择排序的效率快一倍。 

//选择排序
// 时间复杂度:O(n2)
//思路:每次从待排序列中选出一个最小值,
// 然后放在序列的起始位置,直到全部待排数据排完即可。
void selectionSort1(int arr[], int length)
{int min = 0;for (int i = 0; i < length; i++){for (int j = i; j < length; j++){if (arr[min] > arr[j]){int temp = arr[min];arr[min] = arr[j];arr[j] = temp;}}min++;}}
//优化升级:实际上,我们可以一趟选出两个值,一个最大值一个最小值,
//然后将其放在序列开头和末尾,这样可以使选择排序的效率快一倍。
void selectionSort2(int arr[], int length)
{int min = 0;int max = length - 1;for (int i = 0; i < length; i++){for (int j = i; j < length-i; j++){if (arr[min] > arr[j]){int temp = arr[min];arr[min] = arr[j];arr[j] = temp;}if (arr[max] < arr[j]){int temp = arr[max];arr[max] = arr[j];arr[j] = temp;}}min++;max--;}}

3、插值排序

思路:
  在待排序的元素中,假设前n-1个元素已有序,现将第n个元素插入到前面已经排好的序列中,使得前n个元素有序。按照此法对所有元素进行插入,直到整个序列有序。
  但我们并不能确定待排元素中究竟哪一部分是有序的,所以我们一开始只能认为第一个元素是有序的,依次将其后面的元素插入到这个有序序列中来,直到整个序列有序为止。

 //插值排序       从小到大的顺序排列
void insertSort1(int arr[], int length)
{//假设第1个元素就是有序序列,直接从第2个元素开始插入for (int i = 1; i < length; i++){int end = i;//有序序列的结束位置   也是待排的插入数据int temp = arr[i];//记录待排序数值while (end > 0){if (arr[end - 1] > temp){arr[end] = arr[end - 1];end--;}else{break;}}arr[end] = temp;}}
//插值排序的另一种写法:     从小到大排序
void insertSort2(int arr[], int length)
{for (int i = 1; i < length; i++){int end = i;//有序序列的结束位置   也是待排的插入数据int temp = arr[i];//记录待排序数值for (int j = i; j >= 0; j--) {if (arr[j-1] > temp)//后移{arr[j] = arr[j - 1];//后移end--;}else{break;}}arr[end] = temp;}}

4、快速排序

/*快速排序,说白了就是给基准数据找其正确索引位置的过程*/
int getIndex(int arr[], int low, int high)
{int pivot = arr[low];//pivot  支点while (low < high){while (low < high && arr[high] >= pivot){high--;}arr[low] = arr[high];while (low < high && arr[low] <= pivot){low++;}arr[high] = arr[low];}arr[low] = pivot;//arr[high] = pivotreturn low;//return high
}//快速排序,使用递归
void quickSort(int arr[], int low, int high)
{if (low < high){int temp = getIndex(arr, low, high);quickSort(arr, low, temp - 1);quickSort(arr, temp + 1, high);}}


http://www.ppmy.cn/news/1570000.html

相关文章

LabVIEW图片识别逆向建模系统

本文介绍了一个基于LabVIEW的图片识别逆向建模系统的开发过程。系统利用LabVIEW的强大视觉处理功能&#xff0c;通过二维图片快速生成对应的三维模型&#xff0c;不仅降低了逆向建模的技术门槛&#xff0c;还大幅提升了建模效率。 ​ 项目背景 在传统的逆向建模过程中&#xf…

BOOST开关调整器拓扑

电路原理 在V和开关管Q1之间串接电感L1。当Q1导通时,电流从电感L1的下端流入 Q1。当 Q1关断时,电流从电感L1的下端通过整流二极管D1输送给输出电容C。及负载。 假设输出电压和电流已建立,电路已稳定运行,当Q1导通时(Tm),二极管反偏截止,L1的电流线性上升达到峰值l。 V T„/L1…

C++中常用的十大排序方法之4——希尔排序

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C中常用的排序方法之4——希尔排序的相…

计算机网络笔记再战——理解几个经典的协议5——围绕IP的几个辅助协议

目录 DNS DNS查询 ARP ICMP DHCP NAT DNS 没人喜欢天天背诵&#xff0c;输入一场串IP&#xff01;我们需要一个稍微有含义一点的名称——比如说www.google.com来标记我访问的是谷歌&#xff0c;而不是一大长串的IP地址&#xff01;域名服务解析就是一个完成这样的功能的一…

计算机网络网络层进阶:NAT、ARP 与 IP 系列技术全析!!!

一、网络地址转换NAT 私有IP 地址(内网IP)&#xff1a; 10.0.0.0~10.255.255.255 172.16.0.0~172.31.255.255 192.168.0.0~192.168.255.255 只允许分配给局域网内部的节点,不允许分配给互联网上的节点每个局域网内部都可以自行分配这些私有 IP 地址私有 IP 地址是可复用的&…

深入解析:如何利用 Python 爬虫获取商品 SKU 详细信息

在电商领域&#xff0c;SKU&#xff08;Stock Keeping Unit&#xff0c;库存单位&#xff09;详细信息是电商运营的核心数据之一。它不仅包含了商品的规格、价格、库存等关键信息&#xff0c;还直接影响到库存管理、价格策略和市场分析等多个方面。本文将详细介绍如何利用 Pyth…

Apache SeaTunnel 整体架构运行原理

概述 SeaTunnel 缘起 数据集成在现代企业的数据治理和决策支持中扮演着至关重要的角色。随着数据源的多样化和数据量的迅速增长及业务需求的快速变化&#xff0c;企业需要具备强大的数据集成能力来高效地处理数据。SeaTunnel通过其高度可扩展和灵活的架构&#xff0c;帮助企业…

【FPGA】 MIPS 12条整数指令 【3】

实现乘除 修改框架 EX&#xff1a;实现带符号乘除法和无符号乘除法 HiLo寄存器&#xff1a;用于存放乘法和除法的运算结果。Hi、Lo为32bit寄存器。电路描述与实现RegFile思想一致 代码