java排序算法(1)—选择排序

来源:互联网 发布:手机歌词软件 编辑:程序博客网 时间:2024/05/29 14:51

1、概述

排序就是将一组对象按照某种逻辑顺序重新排列的过程。

  • 选择排序基本思想:

    (1)首先找到数组中最小的那个元素,其次将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。

    (2)再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。

    (3)如此往复,直到整个数组排序。它在不断的选择剩余元素中的最小中,因此叫选择排序。

2、代码实现

package com.chunsoft.sort;public class SelectSort {    //测试程序    public static void main(String[] args) {        int nums[] = {1,3,2,4,1,9,3,7,4};        F_SelectSort(nums);        for(int i:nums) {            System.out.println(i);        }    }    //排序方法    public static void F_SelectSort(int[] nums) {        int size = nums.length; //数组长度        //边界验证        if(nums == null ||  size <= 0) {            return;        }        for(int i = 0;i < size;i ++) {            //将当前下标定义为最小值下标            int min = i;            for(int j = i + 1;j < size;j++) {                //如果有小于当前最小值的关键字,将关键字的下标赋给min                if(nums[min] > nums[j]) {                    min = j;                }            }            //如果min不等于i说明当前位置不是最小值,则交换            if(i != min) {                int temp = nums[i];                nums[i] = nums[min];                nums[min] = temp;            }        }    }}

3、复杂度和稳定性

(1)复杂度

如上代码实现,选择排序的内循环,只是在比较当前元素与目前的已知的最小元素(以及将当前索引加1和检查代码是否越界)。交换元素的代码写在内循环之外,每次交换都能排定一个元素,因此交互的总次数是N。因此算法的时间效率取决于比较的次数。在代码中可以看到,0~N-1的任意i都会进行一次交换和N-1-i次比较,因此总共有N次交换和(N-1)+ (N-2)+…+2+1=N(N-1)/2~N*N/2次比较。

时间复杂度:O(N*N)
空间复杂度:O(1)

(2)稳定性

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。

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

(3)特点
(1)运行时间和输入无关(输入有序,也要不断比较);
(2)数据移动最少(N次交换,其他算法不具备的特征)。

0 0