常见排序算法总结——5、选择排序
2020-07-18 04:11
92 查看
常见排序方法
原创文章,转载请添加本网页链接
https://blog.csdn.net/qq_37334950/article/details/104647203
5、选择排序:将数组中待排序的元素中最小(大)的元素取出,放在数组中已排序的元素序列的末尾,直至数组中没有待排序的元素
举例:
分析:对于n个元素的数组,进行了(n-1)次选择,每次选择进行了(n-1)~1次比较,平均每次选择了n/2次,一共比较了n(n-1)/2次
代码逻辑:首先做一个i = 0 ; i < n的循环A,代表(n-1)次的选择。然后做一个j = (i+1) ; j < n 的循环B,代表每次选择的比较次数,在循环B中记录最小(大)的元素位置k。最后将数组中i位置的元素和k位置的元素互换位置
代码示例(代码工具-AS):
public static void main(String args[]){ ArrayList<Integer> list = new ArrayList<>(); list.add(8); list.add(17); list.add(7); list.add(10); list.add(4); list.add(1); log(list,"默认数组:");//打印数组 for (int i = 0; i < list.size(); i++) {//做一个(n-1)次的循环代表进行了(n-1)次的选择 int k = i;//先记录第一个待排序的元素位置 for (int j = (k+1); j < list.size(); j++) {//做一个(n-1)~1次的循环代表比较了(n-1)~1次 if (list.get(j) < list.get(k)){//比较元素 k = j;//如果循环中的元素值小于记录的元素值,则更改记录的元素值的位置k } } if (i != k){//i不等于k,说明存在更小(大)的元素值 int item = list.get(k); list.set(k,list.get(i)); list.set(i,item); } } log(list,"排序数组:");//打印数组 }
/** * 打印数组 * @param list 要打印的数组 * @param string 打印前缀 */ private static void log(ArrayList<Integer> list,String string){ String s = ""; for (int m = 0; m < list.size(); m++) { if (m == 0){ s = list.get(0)+""; } else { s = s + "," + (list.get(m)+""); } } if (string == null){ System.out.println("--打印数组:" + s); } else { System.out.println(string + s); } }
结果一览:
结果分析:选择排序不存在最佳和最差的排序顺序,无论待排序数组的序列情况,都要进行n(n-1)/2次比较。而且在选择互换位置过程中,会出现相同元素的先后顺序互换的情况(如:5,3,2,5,1在第一次选择时变成1,3,2,5,5。两个5的先后顺序改变了),所以选择排序是一种不稳定的排序算法。
相关文章推荐
- 常见排序算法总结分析之选择排序与归并排序-C#实现
- 排序算法总结之插入排序、选择排序
- 排序算法总结(一)——冒泡、插入、希尔与选择排序
- 常见排序算法整理(二)----希尔排序,选择排序
- 常见的排序算法(二) 选择排序
- 常见的几种排序算法一-选择排序,插入排序
- (一)几种排序算法的学习总结(选择排序与插入排序)
- 基础排序算法总结(插入、选择、冒泡、合并、二分查找、堆排序、快速排序、基数排序、桶排序、计数排序)
- 常见排序算法的实现(归并排序、快速排序、堆排序、选择排序、插入排序、希尔排序)
- 常见算法:C语言中的排序算法--冒泡排序,选择排序,希尔排序
- 常见排序算法总结与分析之交换排序与插入排序-C#实现
- C++各种常见排序算法 冒泡排序,插入排序,快排序,选择排序,希尔排序
- 排序算法总结(八)选择排序
- 常见经典排序算法学习总结(插入、shell、冒泡、选择、归并、快排等)
- Java排序算法总结之选择排序
- 常见的排序算法示例(2)-选择排序、插入排序、希尔排序
- Java常用排序算法冒泡排序与选择排序总结
- 黑马程序员_常见排序算法:冒泡排序、选择排序和插入排序
- 排序算法总结之直接选择排序
- 对常见排序算法的总结(选择、插入、希尔、归并、快速、堆排序)