排序算法之选择排序

思路:简单来说,选择排序,选择选择,就是不断选择最小值!

首先在该序列中,找到最小值,与第一位对调。如果这样还觉得抽象,那我们来看一个例子:

8,5,7,3,6

首先我们可以找到,最小的是3,那么我们把3和第一位的8对调

3,5,7,8,6                (第一趟)

接下来,在剩下的数字中,找最小值,很明显是5,那么就不需要变化

3,5,7,8,6                (第二趟)

重复操作:

3,5,6,8,7                (第三趟)

到了最后两个数,我们可以发现,我们只需要做一次排序,也就是将7和8排序之后,整个排序就完成了!因为我们不断的在找最小值,也就是说,当只剩下两个数的时候,找到最小值,那么剩下的那个数就是最大的!!!

3,5,6,7,8                (第四趟)

由此可见,5个数,我们要进行4次排序,那么n个数,就是n-1次排序!(外层for循环的次数)

代码实现思路:我们上面分析了,要进行n-1次排序,那么外层for循环就是i=0到i<n-1()

对于每一次排序呢,我们都是从还没进行排序的序列(我们叫他无序序列吧)中,找到最小值,我们可以先假定无序序列的第一个值就是最小值,那么我们应当从他的后面一个数字开始遍历,到最后一个数,如果找到了最小值,就与第一个数对调。(内层for循环 j从i+1开始)

代码实现如下:

public class SelectSort {
    /**注意,要求是实现数组的两个值兑换,
    我肯定要传入当前数组。
    不然只是吧两个数值对换,但是没有写入当前数组!
    */
    private void Swap(int[] t, int a,int b){
        int temp;
        temp = t[a];
        t[a] = t[b];
        t[b] = temp;
    }

// a[]:表示传入的序列,n是序列的个数
 public void sortselect(int a[],int n){
     // 最小值的下标
     int min;
     // 要进行n-1趟排序 
     for (int i = 0; i < n-1; i++)
     {
         /* 每次排序从无序序列中找出最小值 */
         min = i; /* 假设最小值为当前无序序列的第一个值*/
        /* 从当前数字的后面一个开始遍历,一直到最后一位 */
         for (int j = i+1; j < n; j++)
         {
             if (a[j] < a[min])
             {
                 /* 如果找到了新的最小值,记录他的下标 */
                 /*  这里使用下标的好处是,当找到更小的值的时候,可以直接记录下标。
                     最后在找完所有的序列时,拿找到的下标和第一个元素下标去比较。
                     如果改变了,证明有元素比第一个小,则交换这两个数 而不是找到一                
                     个小的值就去换*/
                 min = j;
             }
         }
         if (min != i)
         {
             /* 如果发现下标发生改变(也就是说找到了比当前第一个元素小的值) */
             Swap(a,a[i],a[min]);
         }
     }
     for (int t:a) {
         System.out.print(t);
     }
 }

}

附上选择排序的动图(动图出自菜鸟教程的选择排序 链接是:1.2 选择排序 | 菜鸟教程

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值