选择排序 【SelectionSort】

标签: SelectionSort 选择排序
0人阅读 评论(0) 收藏 举报
分类:

选择排序

假设初始的数组是[5,4,7,2] 以从小到大排序为例,我们可以将数组分为两个区域,一个是无序区,一个是有序区,在一开始所有的数据都在无序区。

  1. 进行第一轮排序,对无序区的数组[5,4,7,2]进行遍历,记录最小值2,然后将它与第0个元素进行位置交换。此时无序数组[4,7,5],有序数组[1],原本的数组[1,4,7,5]
  2. 进行第二轮排序,对无序区的数组[4,7,5]进行遍历,记录最小值4,然后将它与第1个元素进行位置交换。当然自己本身就处于第一个元素的位置,所以可以不变,此时无序区数组[7,5] ,有序数组[1,4],原本的数组[1,4,7,5]
  3. 进行第三轮排序,对无序区数组[7,5]进行遍历,记录最小值5,然后将它与第2个元素进行位置交换。此时数组[2,4,,5,7]

总结:
1. 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置
2. 重复一过程

算法实现

public class SelecitionSort {

    public void selectionSort(int[] arr) {
        if(arr == null || arr.length == 1) {
            return ;
        }
        for (int i = 0; i < arr.length - 1; i++) {
            int minIndex = i;
            for (int j = i + 1; j < arr.length; j++) {
                minIndex = arr[j] < arr[minIndex] ? j : minIndex;
            }
            swap(arr, i, minIndex);
        }
    }

    private void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp; 
    }
}

时间复杂度

需要进行n-1次排序(n为数组长度),每一次排序需要进行n-i次比较(i为当前第几次排序)。所以时间复杂度为 O(N^2)

即使考虑了初始化数据的情况,时间复杂度也是O(N^2), 只是需要交换的次数为0,最坏的情况会交换n-1次。

稳定性

选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。比较拗口,举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。

查看评论

Java语言中字符的处理

----摘要:本文主要讨论了Java语言中字符的特殊表达形式,尤其是中文信息的表达处理,阐述了字符处理的关键是要将十六位Unicode字符,转换为本地下层平台,也就是运行Java虚拟处理机的平台能够理...
  • wxyxl
  • wxyxl
  • 2001-05-15 16:15:00
  • 7432

选择排序(Selection Sort)原理及Java实现

选择排序(Selection Sort )分为两种 简单选择排序(Simple Selection Sort) 和树形选择排序。 简单选择排序(Simple Selection Sort): 简单...
  • sun_star1chen
  • sun_star1chen
  • 2014-01-16 09:10:01
  • 1656

选择排序(Java语言实现)

package com.shan.selectionSort;/** * * @author shan *选择排序:假设要按升序排列一个数列, *选择排序先找到数列中最小的数,然后将它放到数...
  • stuShan
  • stuShan
  • 2015-10-14 23:27:49
  • 826

c/c++选择排序(SelectionSort)

选择排序原理是,先选取第一个数与其他所有数比较,把比较后的最小的数与第一个数交换,这样每执行一次循环就会将最小的数排到最左边,并且下一次循环比较时就会从第二个数再进行比较,也就是少比较一次,同冒泡排序...
  • gaohuazhao
  • gaohuazhao
  • 2016-06-22 10:48:32
  • 1448

排序算法之选择排序<Selection_Sort>及其C语言代码实现

概述 一个选择排序是一种简单排序,它的排序思路是:每次从未排序的序列中选出一个最小值,并把它放在已排好序的序列的序尾。这样就形成了一个有序序列(从小到大)。 时间复杂度:o(n^2) 核心代码:...
  • gl486546
  • gl486546
  • 2016-11-06 10:08:45
  • 2537

python——选择排序

选择排序:一次遍历取出数组中最小(大)的数存储到另一个数组中,时间为O(n^2)# 取出数组中最小的数的索引 def findSmaller(arr): smallest = arr[0] sma...
  • momozcal
  • momozcal
  • 2018-03-20 13:07:37
  • 16

C++选择排序法(Selection Sort)

// implementation of Selection Sort (C++) #include using namespace std; void SwapTwo(int& a, in...
  • lijialinapple
  • lijialinapple
  • 2014-04-04 17:37:25
  • 2518

选择排序 - SelectionSort

选择排序-SelectionSort选择排序是一种很直观的排序算法,就是每次选出最小(大)的元素,依次放在序列的前面。基本思想在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数 交换(s...
  • u010865433
  • u010865433
  • 2015-10-19 18:32:51
  • 264

选择排序-SelectionSort

算法思想: 从所有序列中先找到最小的,然后放到第一个位置。之后再看剩余元素中最小的,放到第二个位置……以此类推,就可以完成整个的排序工作了。可以很清楚的发现,选择排序是固定位置,找元素,然后将元素调...
  • hellocooper
  • hellocooper
  • 2015-08-28 17:13:18
  • 236

选择排序SelectionSort

package w3ang.algorithms; import java.util.ArrayList; import java.util.Collections; public class Sel...
  • dreamxiaowei
  • dreamxiaowei
  • 2017-02-13 08:56:19
  • 214
    个人资料
    持之以恒
    等级:
    访问量: 2万+
    积分: 1080
    排名: 4万+
    最新评论