经典排序之选择排序

经典排序之选择排序

选择排序(SelectionSort)的算法思想:对于数组中n个待排序的元素,进行n-1次排序,每次选出待排序数据集中的最小数(或最大数),然后将选出的最小数(或最大数)与当前待排序数据集的首个数交换;以此类推,直到排序结束,整个待排序数组也成为有序数组。

之所以称为选择排序,意为每次选出最小或最大的数,从而完成排序。

我接下来通过代码演示:

package 排序算法.选择排序;

import java.util.Arrays;

/**
 * 选择排序
 */
public class Test {
    static int num=0;//计算排序次数
    static void selectSort(int[] arr){
        System.out.println("排序前:"+ Arrays.toString(arr));
        for(int i=0;i<arr.length-1;i++){
            int k=i;//选择最小的数放在首位
            for(int j=k+1;j<arr.length;j++){
                if(arr[j]<arr[k]){
                    k=j;
                }
            }
            if(i!=k){
                int temp=arr[i];
                arr[i]=arr[k];
                arr[k]=temp;
                System.out.println("第"+(++num)+"次排序:"+Arrays.toString(arr));
            }
        }
    }
    public static void main(String[] args) {
        int[] arr=new int[]{15,32,14,86,54,78,36};
        selectSort(arr);
        System.out.println("排序后:"+ Arrays.toString(arr));
    }
}

 上述代码运行后的结果:  

排序前:[15, 32, 14, 86, 54, 78, 36]
第1次排序:[14, 32, 15, 86, 54, 78, 36]
第2次排序:[14, 15, 32, 86, 54, 78, 36]
第3次排序:[14, 15, 32, 36, 54, 78, 86]
排序后:[14, 15, 32, 36, 54, 78, 86] 

此外,再写个优化后的选择排序:

package com.itszt.test6;

import java.util.Arrays;
/**
 * 选择排序,每次选择最小的数放在待排序部分的首位;
 * 如果放下剩余部分有序,则停止排序
 */
public class Test3 {
    static int k=0;
    public static void main(String[] args) {
        int[] arr={15, 32, 14, 86, 54, 78, 36};
        System.out.println("排序前:"+ Arrays.toString(arr));
        selectSort(arr);
        System.out.println("排序后:"+ Arrays.toString(arr));
    }

    static void selectSort(int[] arr){
        boolean boo=true;//默认有序
        for(int i=0;i<arr.length-1;i++){
            int min=i;//选择最小的数放在待排序部分的首位
            for(int j=i+1;j<arr.length;j++){
                if(arr[min]>arr[j]){
                    boo=false;//存在无序
                    min=j;
                }
            }
            if(boo){
                return;
            }
            if(min!=i){
                int temp=arr[i];
                arr[i]=arr[min];
                arr[min]=temp;
                System.out.println("第"+(++k)+"次排序:"+ Arrays.toString(arr));
            }
        }
    }
}  

最后,选择排序的平均时间复杂度为O(n²),在稳定性方面是不稳定的。

【注:关于排序中的稳定性,请参考本博中的“经典排序之插入排序”文章】

posted @ 2017-12-17 19:02 奔跑在梦想的道路上 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值