排序算法(1)——选择排序
来源:互联网 发布:算法 编辑:程序博客网 时间:2024/06/09 15:59
[转载] 百度百科
1、拟解决问题
输入
n个数的序列<a1,a2,a3,...,an>。
输出
原序列的一个重排<a1*,a2*,a3*,...,an*>;,使得a1*<=a2*<=a3*<=...<=an*
2、选择排序的思想
1)、对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小则用一个变量k来记住他的位置,接着第二次比较,前面“后一个元素”现变成了“前一个元素”,继续跟他的“后一个元素”进行比较如果后面的元素比他要小则用变量k记住它在数组中的位置(下标),等到循环结束的时候,我们应该找到了最小的那个数的下标了;
2)、然后进行判断,如果这个元素的下标不是第一个元素的下标,就让第一个元素跟他交换一下值,这样就找到整个数组中最小的数了。
3)、然后找到数组中第二小的数,让他跟数组中第二个元素交换一下值,以此类推。
3、选择排序的实现
/* 选择排序 */void select_sort(int*a,int n){ int i,j,min,t; for(i=0;i<n-1;i++) { min=i;//查找最小值 for(j=i+1;j<n;j++) if(a[min]>a[j]) min=j; if(min!=i)//判断当前元素是否是就最小值 { t=a[min]; a[min]=a[i]; a[i]=t; } }}
4、选择排序的性能
1、时间复杂度
交换操作次数介于 0 ~ (n - 1) 。最好情况是,已经有序,交换0次;最坏情况交换n-1次;逆序要交换n/2次。
赋值操作次数是交换操作次数的3倍,介于 0 ~ 3 (n - 1) 之间。
比较操作次数次数与关键字的初始状态无关,都是N=(n-1)+(n-2)+…+1=n*(n-1)/2,即满足 O(n^2)。
2、稳定性
如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。
比较拗口,举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。
和其它排序算法比较:
1)、选择排序比冒泡排序的交换次数少多了,由于交换所需的CPU时间 比 比较所需的CPU时间多,所以选择排序比冒泡排序快(n值较小时?还是无论n大小都是?)。
2)、堆排序类似于选择排序。它是利用了最大堆的性质——父亲要大于等于孩子的值,所以根节点是最大值,每次就选择根节点元素放到正确的位置。
- 排序算法1—插入排序、选择排序、冒泡排序
- 排序算法(1)——选择排序
- 排序算法—选择排序
- 排序算法之选择排序——简单选择排序
- 数据结构&算法实践—【排序|选择排序】选择排序
- 排序算法之——选择排序
- 排序算法——选择排序
- 排序算法——选择排序
- 排序算法——简单选择排序
- 排序算法总结——选择排序
- 内部排序算法——选择排序
- 排序算法2——选择排序
- 排序算法——选择排序
- 排序算法——选择排序
- 排序算法——选择排序
- 排序算法——选择排序
- 排序算法——选择排序
- 排序算法——选择排序
- 数据结构之九大排序(JAVA)
- 干货阿里巴巴 开源软件列表
- 整理TabLayout+ViewPager+Fragment的使用
- Kth Largest Element in an Array
- 题目集合2
- 排序算法(1)——选择排序
- Android Volley完全解析(一):初识Volley的基本用法
- python开启并行计算
- 编程语言基本用法总结(Shell,Python,C/C++)
- JVM-内存划分,回收速记
- Java生成验证码图片
- zookeeper原理
- intellij idea本地开发调试hadoop的方法
- 使用Angular-cli搭建Angular Material 2应用示例