Java选择排序

86 阅读2分钟

image.png

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

前述

上一篇: java 冒泡排序

相对于上一个冒泡排序 他的实践复杂度在于 O(n^2)~O(n) 之间 ,然后呢选择牌排序的话一直都是 O(n^2),所以对于数据比较多的数据进行排序的时候其实考虑 冒泡排序可能会相对于快速一点。

选择排序

理论

大白话: 对于选择排序来说 ,其实还是使用 双for 进行排序处理的 ,我先随便选择一个(一般会队列首数或者末尾数),然后呢通过for 循环 进行数据检索 如果后面还存在比这个数据还小的数就将它移动到当前位置 ,下一次的话就一样的逻辑就行。

个人作图示例

选择排序.gif

引用于 菜鸟教程数据 selectionSort.gif

实践

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

image.png

冒泡排序对比

  • 冒泡排序是使用左右两个数两两进行数据对比的 ,而选择排序是选定的数据和这一轮的其所数据对比的

  • 冒泡排序在比对的过程中出现交换数据的情况,而选择排序在这一轮结束之后进行位置交换的

  • 冒泡排序直接是数据交换,而选择排序找到位置以位置的数据进行交换的

  • 实际来看 选择排序的排序会比冒泡排序快 (数据不有序 然后数据不存在重复额情况下)

image.png

  • 另外 对于有序的数据排序的话冒泡会由于选择
  • 稳定性来说 冒泡会实时交换不会变更原本的某些 定理数据位置 ,但是选择的话由于是一轮次交换 相同的数据位置可能存在交换

ending

下一篇: 插入排序