排序算法--选择排序
直接选择排序和直接插入排序类似,都将数据分为有序区和无序区,所不同的是直接播放排序是将无序区的第一个元素直接插入到有序区以形成一个更大的有序区,而直接选择排序是从无序区选一个最小的元素直接放到有序区的最后。
设数组为a[0…n-1]。
1. 初始时,数组全为无序区为a[0..n-1]。令i=0
2. 在无序区a[i…n-1]中选取一个最小的元素,将其与a[i]交换。交换之后a[0…i]就形成了一个有序区。
3. i++并重复第二步直到i==n-1。排序完成。
直接选择排序无疑是最容易实现的,下面给出代码:
void Selectsort(int a[], int n)
{
int i, j, nMinIndex;
for (i = 0; i < n; i++)
{
nMinIndex = i; //找最小元素的位置
for (j = i + 1; j < n; j++)
if (a[j] < a[nMinIndex])
nMinIndex = j;
Swap(a[i], a[nMinIndex]); //将这个元素放到无序区的开头
}
}
在这里,要特别提醒各位注意下Swap()的实现,建议用:
inline void Swap(int &a, int &b)
{
int c = a;
a = b;
b = c;
}
笔试面试时考不用中间数据交换二个数,很多人给出了
inline void Swap1(int &a, int &b)
{
a ^= b;
b ^= a;
a ^= b;
}
在网上搜索下,也可以找到许多这样的写法。不过这样写存在一个隐患,如果a, b指向的是同一个数,那么调用Swap1()函数会使这个数为0。如:
int i = 6;
Swap1(i, i);
printf("%d\n", i);
当然谁都不会在程序中这样的写代码,但回到我们的Selectsort(),如果a[0]就是最小的数,那么在交换时,将会出现将a[0]置0的情况,这种错误相信调试起来也很难发现吧,因此建议大家将交换二数的函数写成:
inline void Swap(int &a, int &b)
{
int c = a;
a = b;
b = c;
}
或者在Swap1()中加个判断,如果二个数据相等就不用交换了:
inline void Swap1(int &a, int &b)
{
if (a != b)
{
a ^= b;
b ^= a;
a ^= b;
}
}
排序算法--选择排序相关推荐
- C语言基础排序算法-选择排序
C语言基础排序算法-选择排序 什么是选择排序? 选择排序(Selection sort)是一种简单直观的排序算法,第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从 ...
- C语言排序算法 选择排序 插入排序 快速排序 qsort实现快排 堆排序
常见排序算法 选择排序 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素 ...
- Java排序算法——选择排序
Java排序算法--选择排序(Selection sort) 传送门 冒泡排序 插入排序 简述 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找 ...
- python排序算法-选择排序
python排序算法-选择排序 一.选择排序 1.一趟排序纪录最小的数,放在第一个位置 2.再一次排序记录列表无序区最小的数,放在第二个位置 关键 有序区.无序区.无序区最小数的位置 代码 def s ...
- 十大经典排序算法-选择排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 排序算法-选择排序-堆排序
排序算法-选择排序-堆排序 堆排序是一种树型选择排序方法.在排序过程中,将 L [ 1... n ] L[1 ... n] L[1...n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点 ...
- 排序算法---选择排序(java版)
简单选择排序 原理 选择排序(Selection Sort)的原理有点类似插入排序,也分已排序区间和未排序区间.但是选择排序每次会从排序区间中找到最小的元素,将其放到已排序区间的末尾. 简单选择排序执 ...
- 排序算法--选择排序(Java实现)
选择排序概念 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中 ...
- 排序算法——选择排序法(Select Sorting)
选择排序(Select Sorting) 基本介绍 选择排序也属于内部排序法,是从预排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的 选择排序思想 选择排序(Selec ...
- [排序算法] 选择排序(2种)
1.直接选择排序 [思想]选出剩下的未排序数据中的最小元素与第i个元素交换 [特点]不稳定 空间代价:O(1) 时间代价:O(n^2) 1 void SelectSort(int Array[], i ...
最新文章
- mysql 5.6多实例_MySQL 5.6.x多实例配置
- 广东线上比赛过程集锦
- [Erlang-0011][OTP] External Term Format
- 第12周学习进度总结
- mongodb 索引去重_PostgreSQL13新特性解读Btree索引去重Deduplication
- Bell数的生成函数推导
- cv2作图cv2.polylines,cv2.fillPoly,cv2.fillConvexPoly多边形时需要注意的地方
- 混亂的思維 ~ 很高興能邂逅到常年不見的竹子
- [线筛五连]线筛约数个数
- 理正深基坑6.0软件备忘录_梳理使用方法01
- .net下如何压缩图片大小,超简单
- 求一个点到任意两个点所在直线距离 C#代码公式
- 一级域名和二级域名的区别
- 浅析互联网行业套路玩法+攻略
- Canvas实例之鼠标移动特效(彩色小球)
- HtmlHelper、TagHelper、局部视图、视图组件
- Arduino Uno 实验11——MQ-3酒精乙醇传感器模块
- restTemplate访问接口
- 计算机图形学直线算法程序,计算机图形学直线生成算法实现.doc
- 机器学习(一):模型的参数估计方法
热门文章
- 2星|《零工经济》:缺少对数据、事实、概括、分析,基本是流于表面的畅想...
- mysql自带计划任务
- MySQL主从数据同步延时分析
- 《MonkeyRunner原理剖析》第九章-MonkeyImage实现原理 - 第七节 - 文件图片及子图处理类BufferedImageChimpImage...
- IP/TCP IP分组的交付与转发
- 推荐一本书(Secure Coding Standard for Java)
- 精彩案例:一碗牛肉面的思考
- mysql使用innodb需要注意的情况
- 几种常见机器学习距离公式
- [Reinforcement Learning] 动态规划(Planning)