排序算法之选择排序
来源:互联网 发布:学校网络环境建设 编辑:程序博客网 时间:2024/05/14 03:02
问题描述:
输入一个原始数列,把它进行升序排序,从小到大输出。
例如:给定数列如下:
5 15 99 45 12 1 90 19 33 41
排序后的结果为:
1 5 12 15 19 33 41 45 90 99
选择排序,就是第一步从所有的数据中选出最小的数放在第一个位置,然后从剩下的数中选出最小的放在第二个位置,以此类推,就能从小到大排好所有的数,下面来看一个具体的过程:
下标值序号: 0 1 2 3 4 5 6 7 8 9
原始状态为: 5 15 99 45 12 1 90 19 33 41
第一趟排序: 1 15 99 45 12 5 90 19 33 41(遍历下标0-9,选出最小的数放在下标为0的位置)
第二趟排序: 1 5 12 99 45 15 90 19 33 41(遍历下标1-9,选出最小的数放在下标为1的位置)
第三趟排序: 1 5 12 15 99 45 90 19 33 41(遍历下标2-9,选出最小的数放在下标为2的位置)
第四趟排序: 1 5 12 15 19 99 90 45 33 41(遍历下标3-9,选出最小的数放在下标为3的位置)
第五趟排序: 1 5 12 15 19 33 99 90 45 41(遍历下标4-9,选出最小的数放在下标为4的位置)
第六趟排序: 1 5 12 15 19 33 99 90 45 41(遍历下标5-9,选出最小的数放在下标为5的位置)
第七趟排序: 1 5 12 15 19 33 41 99 90 45(遍历下标6-9,选出最小的数放在下标为6的位置)
第八趟排序: 1 5 12 15 19 33 41 45 99 90(遍历下标7-9,选出最小的数放在下标为7的位置)
第九趟排序: 1 5 12 15 19 33 41 45 90 99(遍历下标8-9,选出最小的数放在下标为8的位置)
从上面我们可以发现:
1. 对于N个数的数列来说,需要N-1趟才能完全排好
2. 因为每一趟只能选出一个数,并且在选的过程并不能保证后面的数已经有序了
3. 这个算法是一个不稳定的排序算法,因为如果是相同的两个数,他们的相对顺序排序前和排序后会不一样
4. 这个算法的时间复杂度是O(n^2)
参考代码:
#include<stdio.h>int main(){ int arr[] = { 5, 15, 99, 45, 12, 1, 90, 19, 33, 41 }; int i, j, nTemp, nCount = sizeof(arr) / sizeof(arr[0]); printf("排序前\n"); for (i = 0; i < nCount; i++) printf("%d ", arr[i]); printf("\n"); for (i = 0; i < nCount; i++) { for (j = i + 1; j < nCount; j++)//遍历i到nCount-1把最小的数放在下标为i的位置 { if (arr[j] < arr[i]) { nTemp = arr[j]; arr[j] = arr[i]; arr[i] = nTemp; } } } printf("\n排序后\n"); for (i = 0; i < nCount; i++) printf("%d ", arr[i]); printf("\n"); return 0;}
运行结果:
- 排序算法之选择排序
- 排序算法之选择排序
- 排序算法之选择排序
- 排序算法之选择排序
- 【排序算法】之选择排序
- 排序算法之选择排序
- 排序算法之选择排序
- 排序算法之选择排序
- 排序算法之选择排序
- 排序算法之选择排序
- 排序算法之选择排序
- 算法-排序之选择排序
- 排序算法之选择排序
- 排序算法之选择排序
- 排序算法之选择排序
- 排序算法之选择排序
- 排序算法之选择排序
- 排序算法之选择排序
- 是先操作数据还是先记日志?
- JAVA生成有规则的订单号
- lua语言制作的定时器
- D
- effective STL 读书笔记——第二章:vector和string
- 排序算法之选择排序
- Leetcode学习(32)—— Maximum Depth of Binary Tree
- scala习题精选100道
- 剖析智能指针
- Ubuntu下安装git及配置使用github
- LZW 压缩算法的C++实现
- 利用Future异步获取多线程的返回结果
- 高德地图之实时导航
- eclispse常用快捷键