排序算法:选择排序
来源:互联网 发布:ipad air2实用软件 编辑:程序博客网 时间:2024/06/15 00:11
选择排序思路:
每次从序列中选取最小的元素与序列前端的元素交换,依次类推,对于长度为n的序列,进行n-1趟排序后序列将变为有序。
由于每趟排序过程中,都是比较完成后才进行交换,所以选择排序的交换次数为n-1次,如果考虑到最小元素可能就是当前元素无需交换,则选择排序的交换次数<=n-1。
以长度为6的序列 {6,3,5,4,1,2} 的选择排序过程做示范:
第一趟排序:[1] 3 5 4 6 2 (最小元素1与6交换)
第二趟排序:[1 2] 5 4 6 3 (最小元素2与3交换)
第三趟排序:[1 2 3] 4 6 5 (最小元素3与5交换)
第四趟排序:[1 2 3 4] 6 5 (4为最小元素无需交换)
第五趟排序:[1 2 3 4 5] 6 (最小元素5与6交换)
本文根据上述的选择排序思路给出C++与Java的代码实现,并且使用Java对选择排序算法和排序算法:冒泡排序中的两种冒泡算法进行性能比较。
C++代码实现:
void swap(int *a, int *b){ int temp = *a; *a = *b; *b = temp;}void SelectSort(int *arr, int length){ if (arr == NULL || length <= 0)return; int index; int min; for (int i = 0; i < length-1; ++i) { min = arr[i] index = i; for (int j = i + 1; j < length; ++j) { if (arr[j] < min) { index = j; min = arr[j]; } } if (index != i)swap(&arr[i], &arr[index]); }
Java代码:
private void selectSort(List<Integer> list) { int length = list.size(); for (int i = 0; i < length - 1; ++i) { int min = list.get(i); int indexOfMin = i; for (int j = i + 1; j <= length - 1; ++j) { int currentNum = list.get(j); if (currentNum < min) { min = currentNum; indexOfMin = j; } } if (indexOfMin != i) { swap(list, i, indexOfMin); } }}
使用完全相同的元素为整数的List对选择排序算法以及两种冒泡排序算法进行性能测试结果如下:
序列元素个数为1000时:
序列元素个数为5000时:
序列元素个数为10000时:
序列元素个数为50000时:
可以发现,选择排序的效率表现是远远高于冒泡法的,其中一个很重要的原因就是选择排序法的交换次数一定是小于等于N的,这大大的降低了程序运行过程中的开销。
0 0
- 排序算法-选择排序
- 排序算法-选择排序
- 排序算法--选择排序
- 排序算法---选择排序
- 排序算法-选择排序
- 排序算法-选择排序
- 排序算法-选择排序
- 排序算法---选择排序
- 排序算法--选择排序
- 排序算法--选择排序
- 排序算法--选择排序
- 排序算法--选择排序
- 算法-排序-选择排序
- 排序算法:选择排序
- 排序算法---选择排序
- 排序算法:选择排序
- 排序算法--选择排序
- 算法排序 -- 选择排序
- java简单画图板的实现
- QT 3D原来是这么个东西
- 锁优化学习总结(一)
- HDU-1331-Function Run Fun(记忆化搜索,dp)
- 深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接
- 排序算法:选择排序
- 在c++中“/”和“%”的妙用
- CSS Grid布局:合并单元格布局
- 详细介绍常用的线程同步互斥机制 关键段、事件、互斥量、信号量
- 作业系列 - 尝试编写SQL数据库(一)
- Leetcode 437. Path Sum III 路径和3 解题报告
- java基础之面向对象(一)
- 04测试开发面试题
- 51NOD 背包问题v2(动态规划)