排序-选择排序

前言

java中排序通过Comparable接口实现,Integer、Double、String、Date、File等都实现了Comparable接口,此类数据类型可以通过v.compareTo(w)进行比较。在研究排序算法时的成本模型为比较和交换的数量,一些不存在交换的算法通过访问数组的次数进行统计

选择排序

/*
* name:选择排序
*
* 成本模型:交换和比较的次数,如果没有则使用数组访问的次数
* 策略:通过循环找出最小的值并与第一个值交换,接着在剩下的
*       值中找出最小的值并与第二个进行交换,以此类推,每次
*       选择出最小的值,所以被称为选择排序
*
* 分析:内循环每次会进行N-i-1次比较和一次交换,所以整体会进行N次数组交换和N²/2次比较
*
* Input:S O R T E X A M P L E
*
* 增长数量级:N²/2
* */
public class Selection {
    public static void sort(Comparable[] a){
        int N = a.length;
        for(int i=0;i<N;i++){
            int min = i;
            for(int j=i+1;j<N;j++)
                if(less(a[j],a[min])) min = j;
            exch(a,i,min);// 交换
        }
    }
    private static boolean less(Comparable v,Comparable w){
        return v.compareTo(w)<0;
    }
    private static void exch(Comparable[] a,int vIndex,int wIndex){
        Comparable temp = a[vIndex];
        a[vIndex] = a[wIndex];
        a[wIndex] = temp;
    }
    private static void show(Comparable[] a){
       for(int i=0,len=a.length;i<len;i++)
           StdOut.print(a[i]+" ");
       StdOut.println();
    }
    private static boolean isSorted(Comparable[] a){
        for(int i=1,len=a.length;i<len;i++)
            if(less(a[i],a[i-1])) return false;
        return true;
    }
    public static void main(String[] args){
        String[] a = new In(args[0]).readAllStrings();
        sort(a);
        assert isSorted(a);
        show(a);
    }
}

实现策略

通过循环找出最小的元素并与第一个元素进行交换,接着在剩下的元素中找出最小的元素并且与第二个元素进行交换,以此类推进行排序

分析

整体增长数量级是平方级别,在“比较和交换”这样的成本模型下,会进行N-i-1次比较操作less(a[j],a[min]),N-1+N-2+…+2+1~N²/2,会进行N次交换操作exch(a,i,min),所以整体增长数量级为N²/2。整体运行时间不依赖于输入,只要是相同的大小,运行时间是相同的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值