开源硬件
Arduino
客制化键盘
Arduino_寄存器
二进制运算
寄存器+二进制运算
LCD-逐字显示
密码依次录入
等待输入
WiFi Duck(无线击键注入攻击平台)
WiFi Duc-New
WiFi Duc-Old
蓝牙无线烧录
ESP8266
ESP-NOW
ESP8266看门狗
ESP8266-休眠模式
ESP01/01S使用说明
WIFI_SD
ESP8266-Web服务器
ESP8266-WIFI自动认证
ESP32
ESP32 ADC2
ESP32_PWM
ESP32_CAM
ESP32 小坦克
ESP32_限电保护
Arduino IDE 添加 ESP32
ESP32-iPhone BLE攻击
STM32
STM32F103-虚拟键盘
STC
STC8G1K08(A)
树莓派-触摸屏
Arduino IDE
Arduino_自制库
Arduino库收集
常见排序算法
冒泡排序
选择排序
插入排序
希尔排序
归并排序
快速排序
计数排序
预处理
millis(运行时长)
Arduino IDE 2.X-修改数据位置
Mixly
Mixly安装教程
Mixly 模块介绍
Mixly-添加ESP32CAM支持
Mixly-库定制工具
模块
4G模块连接物联网
GPS模块
语音模块(JQ8900)
安信可VB语音识别
28BYJ-48(5V步进)
FreeRTOS
FreeRTOS-多任务基础
FreeRTOS-任务共享全局变量
FreeRTOS-多核多任务
FreeRTOS-MUTEX
FreeRTOS-常规程序改多任务
FreeRTOS-定时器
LaserGRBL(激光雕刻)
LaserGRBL-GRBL
GRBL-CNC Shield v4
MicroPython
Scratch
Wokwi(在线仿真)
html转无符号数组
待做开源项目
本文档使用 MrDoc 发布
-
+
首页
选择排序
## 选择排序  **基本思想:** - 即每次从待排序列中选出一个最小值,然后放在序列的起始位置,直到全部待排数据排完即可 **算法描述:** n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果: 1. 初始状态:无序区为R[1…n],有序区为空 2. 第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1…i-1]和R(i…n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1…i]和R[i+1…n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区 3. n-1趟结束,数组有序化了 [wokwi_选择排序](https://wokwi.com/projects/332791245340410451)|[wokwi_选择排序](https://wokwi.com/projects/334327008171393618) ### 选择排序(一次一个数) ```c // 选择排序(一次一个数),SelectSort(数组名,数组长度,[排序方向,默认小到大]) // 即每次从待排序列中选出一个最小值,然后放在序列的起始位置,直到全部待排数据排完即可 void SelectSort(int array[], int size,boolean forward = true){ // i代表参与该趟选择排序的第一个元素的下标 for (int i = 0; i < size; i++){ // 当前选择的元素 int start = i; // 记录最小元素的下标 int min = start; while (start < size){ // 根据传入的第三个参数,来确定是正向排序(小到大)还是逆向排序(大到小) if (forward == true){ // 判断当前元素和选择的元素那个是最小值,保留最小元素 if (array[start] < array[min]){ // 最小值的下标更新 min = start; } }else{ if (array[start] > array[min]){ // 因为要逆向排序,实际这里是找出最大值了 min = start; } } // 当前选择元素下标增加(往后比较) start++; } // 比较完成后,把当前排序第一个元素与刚筛选出来的最小元素交换位置 int tmp = array[i]; array[i] = array[min]; array[min] = tmp; } } ``` ### 选择排序(一次两个数) ```c // 选择排序(一次两个数),TwoSelectSort(数组名,数组长度,[排序方向,默认小到大]) // 一趟选出两个值,一个最大值一个最小值,然后将其放在序列开头和末尾,这样可以使选择排序的效率快一倍 void TwoSelectSort(int array[], int size,boolean forward = true){ // 记录参与该趟选择排序的第一个元素的下标 int left = 0; // 记录参与该趟选择排序的最后一个元素的下标 int right = size - 1; // 从两边往内,直到两个下标都指向中间 while (left < right){ int minIndex = left;//记录最小元素的下标 int maxIndex = left;//记录最大元素的下标 // 找出最大值及最小值的下标 for (int i = left; i <= right; i++){ // 根据传入的第三个参数,来确定是正向排序(小到大)还是逆向排序(大到小) if (forward == true){ // 判断当前元素是否大于或小于当前记录的最大最小元素 if (array[i] < array[minIndex]) minIndex = i; if (array[i] > array[maxIndex]) maxIndex = i; }else{ if (array[i] > array[minIndex]) minIndex = i; if (array[i] < array[maxIndex]) maxIndex = i; } } // 将最大值和最小值放在序列开头和末尾 // 比较完成后,把当前左侧元素与刚筛选出来的最小元素交换位置 int mintmp = array[left]; array[left] = array[minIndex]; array[minIndex] = mintmp; if (left == maxIndex){ // 防止最大值位于序列开头,被最小值交换 maxIndex = minIndex; } // 比较完成后,把当前右侧元素与刚筛选出来的最大元素交换位置 int maxtmp = array[right]; array[right] = array[maxIndex]; array[maxIndex] = maxtmp; // 下标移动,开始新的比较 left++; right--; } } ```
造物者W
2022年6月13日 13:25
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码