开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
前述
上一篇: java 冒泡排序
相对于上一个冒泡排序 他的实践复杂度在于 O(n^2)~O(n) 之间 ,然后呢选择牌排序的话一直都是 O(n^2),所以对于数据比较多的数据进行排序的时候其实考虑 冒泡排序可能会相对于快速一点。
选择排序
理论
大白话: 对于选择排序来说 ,其实还是使用 双for 进行排序处理的 ,我先随便选择一个(一般会队列首数或者末尾数),然后呢通过for 循环 进行数据检索 如果后面还存在比这个数据还小的数就将它移动到当前位置 ,下一次的话就一样的逻辑就行。
个人作图示例
引用于 菜鸟教程数据
实践
code
/***
* selectSortTest 测试
*/
@Test
public void selectSortTest() {
int[] ints = {1, 3, 5, 8, 2, 9, 7, 10, 6, 88, 23, 56, 21, 15};
System.out.println("原始数组数据");
for (int i = 0; i < ints.length; i++) {
System.out.print(ints[i] + ",");
}
long l = System.nanoTime();
//外层循环进行处理循环遍历次数
for (int i = 0; i < ints.length - 1; i++) {
//初始化认为 第一个索引的数据为最小值
int minIndex = i;
// for 循环查询更加小的数据索引 ,如果下标变换了就表示 找到了更小的数据 可以将原本最小数据的为位置进行更换
for (int j = i + 1; j < ints.length; j++) {
//判断后面是否还有更小的数据进行
if (ints[j] < ints[i]) {
minIndex = j;
}
}
//找到数据更小的数据 进行数据交换
if (i != minIndex) {
int tmp = ints[i];
ints[i] = ints[minIndex];
ints[minIndex] = tmp;
}
}
// 这里需要注意的是关于 打印耗时的 使用的是纳秒 平时使用多的 cu 毫秒啥的统计不出时差可能会显示0
System.out.println("耗时" + (System.nanoTime() - l));
System.out.println("排序之后的数据");
for (int i = 0; i < ints.length; i++) {
System.out.print(ints[i] + ",");
}
}
test result
冒泡排序对比
-
冒泡排序是使用左右两个数两两进行数据对比的 ,而选择排序是选定的数据和这一轮的其所数据对比的
-
冒泡排序在比对的过程中出现交换数据的情况,而选择排序在这一轮结束之后进行位置交换的
-
冒泡排序直接是数据交换,而选择排序找到位置以位置的数据进行交换的
-
实际来看 选择排序的排序会比冒泡排序快 (数据不有序 然后数据不存在重复额情况下)
- 另外 对于有序的数据排序的话冒泡会由于选择
- 稳定性来说 冒泡会实时交换不会变更原本的某些 定理数据位置 ,但是选择的话由于是一轮次交换 相同的数据位置可能存在交换
ending
下一篇: 插入排序