zoukankan      html  css  js  c++  java
  • JAVA学习之选择排序

     

    选择排序(Selection sort)是一种简单直观的排序算法。
    它的工作原理如下。
    首先,在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,
    然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
    以此类推,直到所有元素均排序完毕。

     如,有一个数组为 int[] arrs=new int[]{2,5,4,3,2,1}

     
    首先,我们在数组里面找出最小的值,存放在数组的第一位arrs[0]
    目前arrs[0]=2,分别和索引位置为1,2,3,4,5的元素比较,其中和arrs[5]=1比较时,得到了最小值,并进行交换
    第一次排序的结果是{1,5,4,3,2,2}
     
    然后,我们在数组的剩下的位置查找第二小的元素(即剩下数组中的最小元素),存放在数组的第一位后面,也就是arrs[1]的位置
    由于经过了一次排序,所以数组现在是这样的{1,5,4,3,2,2}
    拿arrs[1]元素的值(注,这个位置的值会变)分别和索引为2,3,4,5的元素比较
    arrs[1]=5比较arrs[2]=4,交换位置得{1,4,5,3,2,2}
    arrs[1]=4比较arrs[3]=3,交换位置得{1,3,5,4,2,2}
    arrs[1]=3比较arrs[4]=2,交换位置得{1,2,5,4,3,2}
    arrs[1]=2比较arrs[5]=2,没有交换为{1,2,5,4,3,2}
    在此,我们已经在数组的第二个位置存放了第二小的值
     
    下面我们为数组第三的位置,选择第三小的值
    由于经过了上次的排序,所以数组现在是这样的{1,2,5,4,3,2}
    拿arrs[2]元素的值(注,这个位置的值会变)分别和索引为3,4,5的元素的值比较
    arrs[2]=5比较arrs[3]=4,发生的交换,得数组为{1,2,4,5,3,2}
    arrs[2]=4比较arrs[4]=3,发生的交换,得数组为{1,2,3,5,4,2}
    arrs[2]=3比较arrs[5]=3,发生的交换,得数组为{1,2,2,5,4,3}
    在此,我们已经的数组第三的位置存放了第三小的值
     
    依次循环
    ......

    到最后得到的数组为{1,2,2,3,4,5} 

     
    整个数组的长度为6,只要我们依次选择好前5个位置存放的值,那么最后一个位置的值就不用比较了,因为最后一个数只有最后一个位置放了,也只能放那个位置
    整个数组排列的重点在于选择的时候,在这个位置的元素和其后面的元素比较的时候,在比较没有完成的时候,所选择的那个位置的值也不是固定的;
    就好像我们在第二个位置选择值的时候,在没有和后面的元素分别比较完的时候,随着比较的进行,第二个位置arrs[1]的值也一直的变,直到数组比较后最后
    才定下了第二小的值为2.

      1 code

     2 
     3 public class SelectSort {
     4 
     5     public static void main(String[] args) {
     6 
     7         int[] arrs = new int[] { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
     8         System.out.println("数组排序前");
     9         printArray(arrs);
    10 
    11         selectSort(arrs);
    12 
    13         System.out.println("数组排序后");
    14         printArray(arrs);
    15 
    16     }
    17 
    18     // 选择排序算法
    19     private static void selectSort(int[] arrs) {
    20         // 选择的索引
    21         for (int i = 0; i < arrs.length - 1; i++) {
    22             // 拿这个索引的元素分别和其后面的元素比较,其中,每比较一次,arrs[i]位置元素的值都有可能发生交换
    23             for (int p = i + 1; p < arrs.length; p++) {
    24                 if (arrs[i] > arrs[p]) {
    25                     int temp = arrs[i];
    26                     arrs[i] = arrs[p];
    27                     arrs[p] = temp;
    28                 }
    29             }
    30         }
    31     }
    32 
    33     // 打印数组方法
    34     public static void printArray(int[] arrs) {
    35         System.out.print("[");
    36         for (int i = 0; i < arrs.length; i++) {
    37             System.out.print(arrs[i]);
    38             if (i != arrs.length - 1) {
    39                 System.out.print(",");
    40             }
    41         }
    42         System.out.println("]");
    43     }
    44 
    45 }
     
  • 相关阅读:
    [校内模拟赛T3]火花灿灿_二分答案_组合数学_贪心
    [loj#539][LibreOJ NOIP Round #1]旅游路线_倍增_dp
    [loj#2005][SDOI2017]相关分析 _线段树
    [bzoj3162]独钓寒江雪_树hash_树形dp
    [bzoj2746][HEOI2012]旅行问题 _AC自动机_倍增
    [bzoj2597][Wc2007]剪刀石头布_费用流
    [bzoj4818][Sdoi2017]序列计数_矩阵乘法_欧拉筛
    vue中的组件传值
    vue中的修饰符
    箭头函数递归斐波那契数列
  • 原文地址:https://www.cnblogs.com/fylx/p/3953808.html
Copyright © 2011-2022 走看看