这篇文章主要介绍了C语言排序算法之选择排序(直接选择排序,堆排序),堆排序使用堆来选数,效率高很多,更多相关内容需要的小伙伴可以参考一下
前言
本期为大家带来的是常见排序算法中的选择排序,主要有直接选择排序以及——堆排序(有点难理解),包您一看就会,快来试试吧~

一、直接选择排序
1.1 算法思想
每一次从待排序的数据元素中选出最小(或最大的)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
在元素集合a[i]--a[n-1]中选择关键码最大(小)的数据元素 若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个) 元素交换 在剩余的 [a[i] , a[n-2] …… [a[i+1],a[n-1] ]集合中,重复上述步骤,直到集合剩 余1个元素。
我们拿一组实例来感受一下,直接选择排序是怎么运算的:

1.2 代码实现
给大家带来一个优化版本的直接选择排序,一次遍历,选出最大数和最小数,然后交换,相较于传统的,效率高了许多。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//交换
void Swap(int* mini, int* maxi)
{
int tmp = *mini;
*mini = *maxi;
*maxi = tmp;
}
//打印
void Print(int* a, int n)
{
for (int i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
}
//直接选择排序
void SelectSort(int *a,int n)
{
//下标
int begin = 0;
int end = n - 1;
while (begin < end)
{
int mini = begin, maxi = end;
//选出最大的给maxi,选出最小的给mini
for (int i=begin;i<=end;++i)
{
if (a[i]>a[mini])//升序
{
mini = i; //改两个if的符号即可实现升序、降序转换。
}
if (a[i] <a[maxi])
{
maxi = i;
}
}
//交换
Swap(&a[begin],&a[mini]);
//因为还有一种特殊情况,就是begin跟maxi重叠,然后执行第一次交换之后,maxi记录的是最小值
if (begin == maxi)
{
maxi = mini;
}
Swap(&a[end], &a[maxi]);
++begin;
--end;
}
}
直接选择排序
//void SelectSort(int* a, int n)//(升序)
//{
// for (int j=0;j<n-1;j++)//整体遍历
// {
// for (int i=j+1;i<n;i++)//遍历比较
// {
// if (a[j] > a[i])//比较交换
// {
// int tmp = a[j];
// a[j] = a[i];
// a[i] = tmp;
// }
// }
// }
/
织梦狗教程
本文标题为:C语言排序算法之选择排序(直接选择排序,堆排序)
基础教程推荐
猜你喜欢
- C语言编程C++旋转字符操作串示例详解 2022-11-20
- 带你深度走入C语言取整以及4种函数 2022-09-17
- [c语言-函数]不定量参数 2023-09-08
- C++实战之二进制数据处理与封装 2023-05-29
- C++实现ETW进行进程变动监控详解 2023-05-15
- [C语言]二叉搜索树 2023-09-07
- C语言 详解字符串基础 2023-03-27
- C语言实现宾馆管理系统课程设计 2023-03-13
- 全面了解C语言 static 关键字 2023-03-26
- centos 7 vscode cmake 编译c++工程 2023-09-17
