直接选择排序
来源:互联网 发布:mac ox驱动下载 编辑:程序博客网 时间:2024/04/28 11:34
直接选择排序算法也是很容易懂的一种算法,算法原理:依次将数组中的最小数放入数组中。
第一次:从a[0]~a[n-1]中选取最小值,与a[0]交换;
第二次:从a[1]~a[n-1]中选取最小值,与a[1]交换;
........
第n-1次:从a[n-2]~a[n-1]中选取最小值,与a[n-2]交换。
总共通过n-1次,所以最外层的循环为0--n-1;
核心算法实现如下:
<span style="font-size:18px;">void selectSort(int *a, int len){ if (a == NULL || len <= 1) { return; } int i, j; for (i = 0; i < len - 1; i++) { int k = i;//保存最小的数的下标 for (j = i + 1; j < len; j++) { if (a[j] < a[k]) { k = j; } } if (k != i)//交换两个数 { int tmp = a[i]; a[i] = a[k]; a[k] = tmp; } }}</span>
直接选择排序时间复杂度虽然为O(n2),但是它确是一个不稳定的排序。(我记得在哪本书中看到说所有复杂度为O(n2)的排序算法是稳定排序)。比如说:1,5,5*,3,在第二次交换中,会把5和3交换,最后的结果为:1,3,5*,5;所以为一种不稳定的排序。它是属于一种选择排序,它也需要一个辅助的存储空间。下面是一个完整的可执行程序源代码。
#include "iostream"using namespace std;void printArray(int *a, int len)//数组的输出{ if (a == NULL) { cout << "数组为空,没有元素\n"; return; } int i; for (i = 0; i < len; i++) { cout << a[i] << " "; } cout << endl;}//直接选择排序 不稳定void selectSort(int *a, int len){ if (a == NULL || len <= 1) { return; } int i, j; for (i = 0; i < len - 1; i++) { int k = i; for (j = i + 1; j < len; j++) { if (a[j] < a[k]) { k = j; } } if (k != i) { int tmp = a[i]; a[i] = a[k]; a[k] = tmp; } }}void main(){ int a[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1 }; int len = sizeof(a) / sizeof(a[0]); printArray(a,len); selectSort(a, len); printArray(a, len); system("pause");}
共同学习,一起进步!如有不足之处,请指出,谢谢!
0 0
- 选择排序-直接选择
- 【排序】直接选择排序
- 【排序】直接选择排序
- 【排序】直接选择排序
- 选择排序--直接选择排序
- 选择排序 - 直接选择排序
- 选择排序-直接选择排序
- 选择排序-直接选择排序
- 直接选择排序
- 直接选择排序
- 直接选择排序
- Java 直接选择排序
- 直接选择排序举例
- 直接选择排序
- 直接选择排序算法
- 直接选择排序
- 直接选择排序
- 直接选择排序
- 一个10进制数二进制表示1的个数,负数用补码
- 字符编码简介
- c++作业2
- net.sf.JSONObject学习
- 使用usort()函数排序二维数组
- 直接选择排序
- Storm架构分析
- APK签名之keytool生成keystore和jarsigner签名apk
- 并行计算机系统与结构模型(一)
- python笔记(四)
- Java开发中的23种设计模式
- Cocoapods
- 一个纯JDBC访问数据库的顺序
- Android 常用网站