码迷,mamicode.com
首页 > 编程语言 > 详细

选择排序 Selection sort

时间:2016-05-02 14:19:20      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:


简介
白哥解释:
        选择排序过程:第 n 轮时是将第 n 个数和后面每一个数进行比较,如果第 m 个数第 n 个数小,就记录第 m 个数的位置,然后继续第 m 个数和后面每一个数进行比较,直到结尾;一共排了 a.length 轮,第 n 轮排序的结果是把最 n 小数的和第 n 个数交换位置
        第 n 轮比较次数为 a.length-n,每一轮交换次数都是 0或1 ,共排序 m=a.length 轮
        所以共比较 (m)+(m-1)+(m-2)+……+2+1=m(m-1)/2 次,共交换 m 次(最多),总的时间复杂度为O(m^2)+O(m)=O(m^2)

过程:
        对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小,则用一个变量k来记住他的位置,接着第二次比较,前面“后一个元素”现变成了“前一个元素”,继续跟他的“后一个元素”进行比较,如果后面的元素比他要小,则用变量k记住它在数组中的位置(下标),等到循环结束的时候,我们应该找到了最小的那个数的下标了,然后进行判断,如果这个元素的下标不是第一个元素的下标,就让第一个元素跟他交换一下值,这样就找到整个数组中最小的数了。然后找到数组中第二小的数,让他跟数组中第二个元素交换一下值,以此类推。

时间复杂度:
        选择排序的交换操作介于 0 和 (n - 1) 次之间。选择排序的比较操作为 n (n - 1) / 2 次之间。选择排序的赋值操作介于 0 和 3 (n - 1) 次之间。
        比较次数O(n^2),比较次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n-2)+...+1=n*(n-1)/2。交换次数O(n),最好情况是,已经有序,交换0次;最坏情况交换n-1次,逆序交换n/2次。交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快。

示例
public static void select(int[] a) {
        System.out.println(Arrays.toString(a));
        int minIndex = 0;
        for (int i = 0; i < a.length; i++) {
            minIndex = i;//无序区的最小数据数组下标
            for (int j = i + 1; j < a.length; j++) {//在无序区中找到最小数据并保存其下标
                if ((a[j] < a[minIndex])) minIndex = j;
            }
            if (minIndex != i) {//如果不是无序区的最小值位置不是默认的第一个数据,则交换之
                int temp = a[i];
                a[i] = a[minIndex];
                a[minIndex] = temp;
            }
            System.out.println(Arrays.toString(a) + "    minIndex=" + minIndex);
        }
    }
[8, 5, 2, 7]
[2, 5, 8, 7]    minIndex=2
[2, 5, 8, 7]    minIndex=1
[2, 5, 7, 8]    minIndex=3
[2, 5, 7, 8]    minIndex=3  





选择排序 Selection sort

标签:

原文地址:http://www.cnblogs.com/baiqiantao/p/5452273.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!