算法系列(四):选择排序

195 阅读3分钟

选择排序介绍:

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)

选择排序过程:

n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:

  1. 初始状态:无序区为R[1..n],有序区为空。
  2. 第1趟排序 在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。 ……
  3. 第i趟排序 第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

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

代码如下:

package com.nineweeks.simplesort;

/**
 * 选择排序
 *
 * 规则:从左边开始 拿第一个值 作为基准值和右边的值相比较,如果右边的值比他小,
 * 那这个值作为基准值和右边的值接着比较,直到最后一个值,
 * 此时确定最小值得下标,和第一个值互换位置,再次循环开始,
 * 从第二个值开始和右边的值比较,以此下去直到有序
 *
 * 选择排序,每经历一次循环,能够确定左边的值在准确的位置
 *
 * 选择排序的时间复杂度:
 *     选择排序和冒泡排序需要相同的O(n2)的比较, 但是只需要O(n)次的交换
 *
 * @author NineWeek
 * @date 2020/05/07 17:09
 **/
public class SelectSort {
    private long[] a;
    private int nElems;

    public SelectSort(int max){
        a = new long[max];
        nElems = 0;
    }

    public void insert(long value){
        a[nElems++] = value;
    }

    public void selectSort(){
        int in,out,min;
        for (out = 0; out <nElems-1;out++){
            min = out;
            for (in = out; in < nElems; in++){
                if(a[in] < a[min]){
                    min = in;
                }
            }
            swap(min,out);
        }
    }
    /**
     * 数值之间的位置交换
     * @param one
     * @param two
     */
    public void swap(int one ,int two ){
        long temp;
        temp = a[one];
        a[one] = a[two];
        a[two] = temp;
    }

    /**
     * 数组的展示方法
     */
    public void display(){
        for (int i = 0; i < nElems ; i++) {
            System.out.print(a[i]+" ");
        }
        System.out.println();
    }

    public  static  void main(String[] args){
        SelectSort  sort = new SelectSort(100);
        sort.insert(77);
        sort.insert(99);
        sort.insert(44);
        sort.insert(55);
        sort.insert(22);
        sort.insert(88);
        sort.insert(11);
        sort.insert(80);
        sort.insert(66);
        sort.insert(33);
        sort.display();
        System.out.println("=============");
        sort.selectSort();
        sort.display();
    }

}

输出结果: