简单排序之选择排序算法JAVA实现

选择排序原理

选择排序是一种简单排序算法。这是一个基于位置比较的算法,通常实现是左边是已经排好序的元素列表,右边是待排序的元素。当然,一开始的时候,我们认为都是未经排序的。

选择排序的精髓:与冒泡排序不同,选择排序是第N趟排序先确定最小元素的位置,然后和第N个元素交换位置。主要特点是每一趟选择一个最小值的索引作为梅一堂最后交换的位置。以一个元素个数为N的整形数组arr为例:

  • 第一趟 以第一个元素arr[0]为基准,准备好一个中间变量temp用来记录该趟最小元素的位置,一开始,temp=0,比较arr[0]和arr[temp]的大小,若后者小于前者,则temp赋新值0,当前较小的值和第三个元素比较,将比较结果较小的索引赋给temp,以此类推,直至最后一个元素,这样第一趟下来,我们得到该数组最小元素的下标,然后交换第一个元素和下标为temp的元素值。
  • 第二趟 第一趟已经将最小的元素放在第一个位置上了,因此以第二个元素开始,temp重新赋值为1,开始和它之后的元素比较,跟第一趟一样,最终得到第二小的元素放置在数组的第二个位置上。
  • 第N趟 得到最大的元素放在数组末尾。
    至此,选择排序算法结束,选择排序算法复杂度O(N),比较次数N-1、N-2、...、1,交换次数N。

选择排序工作流程

以下面的一个原始数组作为一个例子:

第一趟:以第一个元素14为基准,我们找到最小的元素10:

我们交换14和10,这样得到了最小的值放到数组第一个位置中:

第二趟:以第二个元素33为基准,往后找最小的数:

找到第二小的数14,交换第二个元素和14:

完成第二趟排序,至此第二小的元素已经放置在数组的第二个位置中。

后面的排序过程以此类推,以下是整个排序过程:

最后展示完整的选择排序代码:

package org.byron4j.sort;

/**
 *
 * @author Byron.Y.Y
 * @version 1.0
 * Java-选择排序-以整形数组为例
 */
public class SelectionSort {

    /**
     * 注意:该方法仅仅展示选择排序的过程,并没有校验入参arr是否为null
     * @param arr
     */
    public static void sort(int[] arr){
        //数组长度
        int size = arr.length;

        //每一趟的最小值在数组arr中的索引位置
        int temp = 0;

        //中间值,用来交换
        int tempVal = 0;

        /*外层循环控制选择排序的趟数*/
        for( int i = 0; i < size; i++ ){
            temp = i;

            //内层循环,走完一趟,得到该趟最小值所在的索引位置
            for(int j = i+ 1; j < size; j++){
                if( arr[j] < arr[temp] ){
                    temp = j;
                }
            }

            //最小值索引位置与当前基准元素位置不一致,则交换二者
            if( temp != i ){
                tempVal = arr[i];
                arr[i] = arr[temp];
                arr[temp] = tempVal;
            }

            //至此第i+1趟,排序完毕,将第i+1小的元素放在第i+1的位置上
            //这里可以打印出来每一趟选择排序后数组的位置元素
            System.out.print("第" + ( i + 1 ) + "趟: ");
            for(int k = 0; k < size; k++){
                System.out.print(arr[k] + ((k != size -1) ? ", " : ""));
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        int[] arr = {14, 33, 27, 10, 35, 19, 42, 44};
        sort(arr);
    }
}

运行结果:

第1趟: 10, 33, 27, 14, 35, 19, 42, 44
第2趟: 10, 14, 27, 33, 35, 19, 42, 44
第3趟: 10, 14, 19, 33, 35, 27, 42, 44
第4趟: 10, 14, 19, 27, 35, 33, 42, 44
第5趟: 10, 14, 19, 27, 33, 35, 42, 44
第6趟: 10, 14, 19, 27, 33, 35, 42, 44
第7趟: 10, 14, 19, 27, 33, 35, 42, 44
第8趟: 10, 14, 19, 27, 33, 35, 42, 44

原文地址:https://www.cnblogs.com/fefi521/p/9234582.html

时间: 2024-10-07 05:59:58

简单排序之选择排序算法JAVA实现的相关文章

【排序】选择排序算法

特别说明 对于算法,重在理解其思想.解决问题的方法,思路.因此,以下内容全都假定待排序序列的存储结构为:顺序存储结构. 选择排序思想 选择排序又称为简单选择排序,主要思想描述如下: 01.假设待排序列表为 .选择排序将  划分为由已排序好序的  部分 以及 未排序的  部分: 注意:刚开始时  部分其实可认为只有一个元素,即: 元素 02.每次从  部分中选出最小(或最大)的那个元素,将其放在  的末尾位置: 03.重复02步骤,直到  部分为空为止: 编码参考 简单选择排序是非常简单的一种排序

算法基础之排序(2)--选择排序 改进

1 /********************************************************************************************************** 2 * Function : test 3 * Create Date : 2014/03/23 4 * Author : NTSK13 5 * Email : [email protected] 6 * Copyright : 欢迎大家和我一起交流学习,转载请保持源文件的完整性

基础算法之排序(2)--选择排序

1 /********************************************************************************************************** 2 * Function : test 3 * Create Date : 2014/03/23 4 * Author : NTSK13 5 * Email : [email protected] 6 * Copyright : 欢迎大家和我一起交流学习,转载请保持源文件的完整性

java七大排序——3_选择排序

选择排序: 将待排元素分为有序区间和无序区间,无序区间在前,每次从无序区间的所有元素中选出一个最大的数array[max],将该数与无序区间最后一个数进行交换(相当于在有序区间的第一位置新插入一个数)假设开始全部元素都是无序区间内的:继续重复上述操作 最终结果代码实现 public static void selectSort(int[] array) {// //无序区间在前边 //每次选最大数 for (int i = 0; i < array.length - 1; i++) { int

排序(1)---------选择排序(C语言实现)

选择排序的基本思想: 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. 我的通俗解释: ①第一遍先在整个序列中寻找到最小值,将其移到首位,序列被分为1,n-1; ②继续在n-1中寻找最小值,将其移到n-1的首位,也就是整个序列的第二位 ③以此类推,反复操作步骤②,得到结果 选择排序的主要优

选择排序——直接选择排序

选择排序 每一趟从待排序的元素中,选出最小的元素,放到已经排好序的序列的后面直到全部元素排序完毕.在这个过程中,有序区逐步扩大,而无序区逐渐缩小. 直接选择排序 直接选择排序是将无序区内的最小元素追加到有序区的后面,从而扩大有序区的范围.而我们又是在原地排序,所有也就相当与交换无序区的第一个元素和无序区最小元素的位置. 我们需要一个游标来追踪无序区的最小元素. 假设为 K , 我们又同时假设每一趟排序前,无序区的第一个元素就是当前无序区的最小元素. 也就是说 k 在每一次排序开始时,都是指向无序

排序——直接选择排序(简单选择排序)

直接选择排序也称简单选择排序,是一种相对简单的排序算法,它的基本思想是:从一列数中找出最小的,和第一个交换:剩下的重新找出最小的,和这列数的第二个交换,......一直进行n-1次比较之后,该数列已经为有序数列了. 例如:已知一组无序数列:6 3 5 1 4 2 9 第一次:[6 3 5 1 4 2 9] 最小数为:1 第二次:1 [3 5 6 4 2 9] 最小数为:2 第三次:1 2 [5 6 4 3 9] 最小数为:3 第四次:1 2 3 [6 4 5 9] 最小数为:4 第五次:1 2

排序算法整理:冒泡排序、堆排序、插入排序、归并操作、快速排序、希尔排序、选择排序

SortUtils.java package prms.utils.sort; import java.util.Arrays; /** * @ClassName: SortUtils * @Description: <p> 排序算法 工具类 </p> * @author edgar * @email [[email protected]] * @version V 1.0 * @date 2017-3-28 15:35:12 */ public class SortUtils {

简单选择排序(选择排序)-八大排序三大查找汇总(1)

工作原理: 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完. 稳定性: 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面). 时间复杂度: 比较次数O(n^2),比较次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n-2)+...+1=n*(n-1)/2. 交换次数O(n),最好情况是,已经有序,交换0次:最坏情况下,即待排序记录初始状态是按第一条记录最大