Java基础算法(1)——选择排序

Java基础算法(1)——选择排序

1.建立排序基类

为了方便以后专心写排序的逻辑,于是将一些经常重复使用的方法抽离出来,此处参考《算法》第四版一书。

方法简介:

  • sort(Comparable[] a) 排序传入的数组
  • less(Comparable v,Comparable w) 比较v,w的值,若v<w 返回boolean类型
  • exch(Comparable[] a,int i,int j) 交换数组a中下标为i,j两者的值
  • show(Comparable[] a) 控制台输出此数组
  • isSorted(Comparable[] a) 判断数组是否已经排序完成 返回boolean类型
package Algorithm.Sort;

/**
 * 排序算法类的模板2
 * 为了方便测试,具体排序类继承此类即可
 *
 * 方法简介:
 * sort(Comparable[] a) 排序传入的数组
 * less(Comparable v,Comparable w) 比较v,w的值,若v<w 返回boolean类型
 * exch(Comparable[] a,int i,int j) 交换数组a中下标为i,j两者的值
 * show(Comparable[] a) 控制台输出此数组
 * isSorted(Comparable[] a) 判断数组是否已经排序完成 返回boolean类型
 */
public class Template {

    public static void sort(Comparable[] a){

    }

    /**
     * 比较v,w的值,若v<=w 返回true,否则返回false
     * @param v
     * @param w
     * @return
     */
    public static boolean less(Comparable v,Comparable w){
        return v.compareTo(w)<=0;
    }

    /**
     * 交换数组a中下标为i,j两者的值
     * @param a
     * @param i
     * @param j
     */
    public static void exch(Comparable[] a,int i,int j){
        Comparable t=a[i];
        a[i]=a[j];
        a[j]=t;
    }

    /**
     * 输出此数组
     * @param a
     */
    public static void show(Comparable[] a){
        //单行打印数组
        for (int i=0;i<a.length;i++){
            System.out.print(a[i]+" ");
        }
        System.out.println();//换行
    }

    /**
     * 判断数组是否已经排序完成
     * @param a
     * @return
     */
    public static boolean isSorted(Comparable[] a){
        //用于测试数组是否排序
        for (int i=1;i<a.length;i++){
            if(less(a[i],a[i-1])){
                return false;
            }
        }
        return true;
    }
}

2.正题:选择排序思路简介

选择剩余元素之中的最小值,并与当前剩余元素的首元素交换位置

例如:3 8 4 1 2

第一次1和3交换——>1 8 4 3 2

第二次2和8交换——>1 2 4 3 8

第三次3和4交换——>1 2 3 4 8

… ——>1 2 3 4 8

… ——>1 2 3 4 8

第四次第五次应为都是剩余元素里面本身是最小,便和自己交换

更多实现细节在代码中有详细的注释!

3.完整代码实现与详细注释

package Algorithm.Sort;
/**
 * 排序(1)
 * 选择排序
 * 找到数组中最小的元素,与第一个元素交换元素
 * 剩下的元素中再找最小的元素,与第二个交换位置,以此类推
 * (不断选择剩余元素中的最小值)
 * 假设数组元素数量为:N
 * 交换总次数固定为N
 * 因此时间效率取决于元素之间比较次数
 */
public class SelectionSort extends Template {

    //升序
    public static void sort(Comparable[] a) {
        int N = a.length;
        System.out.println("排序过程:");
        for (int i = 0; i < N; i++) {
            //min为当前这次遍历中应该交换的下标(本次遍历最小元素的下标,默认为本次遍历的首元素下标)
            int min = i;
            //从当前默认最小值的下标的下一下标开始比较大小,后者小则更换min下标值
            for (int j = i + 1; j < N; j++) {
                if (less(a[j], a[min]))
                    min = j;
            }
            //本次遍历比较完所有元素后,交换下标为i和下标为min的值,使得min每次都位于剩余元素首部
            exch(a, i, min);
            //输出每次遍历的结果,查看排序过程
            show(a);
        }
    }

    public static void main(String[] args) {
        String[] a = {"c", "s", "d", "n", "x", "i", "n", "g", "w", "e", "i"};
        
        System.out.println("选择排序前");
        show(a);

        //执行选择排序逻辑
        sort(a);

        assert isSorted(a);
        
        System.out.println("选择排序后");
        show(a);
    }

}

4.运行效果

选择排序

发布了67 篇原创文章 · 获赞 32 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_42391904/article/details/99776048