博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转载】白话经典算法系列之四 直接选择排序及交换二个数据的正确实现
阅读量:7011 次
发布时间:2019-06-28

本文共 1395 字,大约阅读时间需要 4 分钟。

直接选择排序和直接插入排序类似,都将数据分为有序区和无序区,所不同的是直接播放排序是将无序区的第一个元素直接插入到有序区以形成一个更大的有序区,而直接选择排序是从无序区选一个最小的元素直接放到有序区的最后。

 

设数组为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。排序完成。

 

直接选择排序无疑是最容易实现的,下面给出代码:

 

View Code
1 void Selectsort(int a[], int n) 2 { 3     int i, j, nMinIndex; 4     for (i = 0; i < n; i++) 5     { 6         nMinIndex = i; //找最小元素的位置 7         for (j = i + 1; j < n; j++) 8             if (a[j] < a[nMinIndex]) 9                 nMinIndex = j;10 11         Swap(a[i], a[nMinIndex]); //将这个元素放到无序区的开头12     }13 }

 

在这里,要特别提醒各位注意下Swap()的实现,建议用:

 

View Code
1 inline void Swap(int &a, int &b)2 {3     int c = a;4     a = b;5     b = c;6 }

 

笔试面试时考不用中间数据交换二个数,很多人给出了

 

View Code
1 inline void Swap1(int &a, int &b)  2 {  3     a ^= b;  4     b ^= a;  5     a ^= b;  6 }

 

在网上搜索下,也可以找到许多这样的写法。不过这样写存在一个隐患,如果a, b指向的是同一个数,那么调用Swap1()函数会使这个数为0。如:

 

View Code
1 int i = 6;2 Swap2(i, i);3 printf("%d %d\n", i);

 

当然谁都不会在程序中这样的写代码,但回到我们的Selectsort(),如果a[0]就是最小的数,那么在交换时,将会出现将a[0]置0的情况,这种错误相信调试起来也很难发现吧,因此建议大家将交换二数的函数写成:

 

View Code
1 inline void Swap(int &a, int &b)2 {3     int c = a;4     a = b;5     b = c;6 }

 

或者在Swap1()中加个判断,如果二个数据相等就不用交换了:

 

 

View Code
1 inline void Swap1(int &a, int &b)2 {3     if (a != b)4     {5         a ^= b;6         b ^= a;7         a ^= b;8     }9 }

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/xiaojiaohuazi/archive/2013/03/22/2974808.html

你可能感兴趣的文章
Maven|项目命令
查看>>
python filter, map, 和reduce
查看>>
memcached 异常 : 单数据项超过默认值1m
查看>>
mysql创建登录报错ERROR1045(28000)
查看>>
virtualbox(windows环境下)centos虚拟机安装增强工具
查看>>
Fragment(碎片)的静态创建
查看>>
Domino 服务器定时重启
查看>>
安装java及环境配置
查看>>
NFS和SAMBA服务备忘录
查看>>
android 短信发送器
查看>>
Logan:美团点评的开源移动端基础日志库
查看>>
获取Java类中所有Field
查看>>
机器学习需要的数学基础
查看>>
puppet自动化运维之类
查看>>
Python在Linux下的Tab补齐
查看>>
部署搭建 Saltstack
查看>>
多备份亮相安卓开发者大会聚焦全球App数据保护
查看>>
sata盘,SSD盘,fusion-IO卡 对比
查看>>
NFS文件服务器使用简介
查看>>
linux文件名通配
查看>>